Again, many thanks to all who provide their solution. I have timed these (though on my old P3(0.9GHz)) - see below Helmut.
Helmut Jarausch wrote: > Hi, > > I'm looking for an elegant solution of the following tiny but common > problem. > > I have a list of tuples (Unique_ID,Date) both of which are strings. > I want to delete the tuple (element) with a given Unique_ID, but > I don't known the corresponding Date. > #!/usr/bin/python import random import timeit Lorg=[] def genList(L) : for f in range(ord('A'),ord('z')+1) : for s in range(ord('A'),ord('z')+1) : L.append((chr(f)+chr(s),str(random.randrange(0,1000000)))) genList(Lorg) Times= 1000 T0= timeit.Timer('L=list(Lorg)','from __main__ import Lorg').timeit(Times) print T0 SetUp1=r'''from __main__ import Lorg def del_by_key(L,key) : d= dict(L) del d[key] L[:]= d.items() ''' SetUp2=r'''from __main__ import Lorg def del_by_key(L,key) : d= dict(L) t= (key,d[key]) L.remove(t) ''' SetUp3=r'''from __main__ import Lorg def del_by_key(L,key) : index= [k for k,val in L] pos = index.index(key) del L[pos] ''' SetUp4=r'''from __main__ import Lorg def del_by_key(L,key) : for pos, (k,d) in enumerate(L): if k == key : del L[pos] break ''' SetUp5=r'''from __main__ import Lorg def del_by_key(L,key) : L[:]= [(k,d) for (k,d) in L if k !=key] ''' SetUp6=r'''from __main__ import Lorg class Tester(object) : def __init__(self,key) : self.key= key def __eq__(self,other) : return other[0] == self.key def del_by_key(L,key) : del L[L.index(Tester(key))] ''' print '*** ready ***' T= timeit.Timer("L=list(Lorg);del_by_key(L,'Zz')",SetUp1).timeit(Times) print "Method 1 :",T-T0 T= timeit.Timer("L=list(Lorg);del_by_key(L,'Zz')",SetUp2).timeit(Times) print "Method 2 :",T-T0 T= timeit.Timer("L=list(Lorg);del_by_key(L,'Zz')",SetUp3).timeit(Times) print "Method 3 :",T-T0 T= timeit.Timer("L=list(Lorg);del_by_key(L,'Zz')",SetUp4).timeit(Times) print "Method 4 :",T-T0 T= timeit.Timer("L=list(Lorg);del_by_key(L,'Zz')",SetUp5).timeit(Times) print "Method 5 :",T-T0 T= timeit.Timer("L=list(Lorg);del_by_key(L,'Zz')",SetUp6).timeit(Times) print "Method 6 :",T-T0 # Results on an old P3 (0.9 GHz) # *** ready *** # Method 1 : 10.9850928783 # Method 2 : 5.96455168724 # Method 3 : 3.97821164131 # Method 4 : 1.66151881218 # Method 5 : 8.90886187553 # Method 6 : 6.2503888607 The clear winner is def del_by_key(L,key) : for pos, (k,d) in enumerate(L): if k == key : del L[pos] break -- Helmut Jarausch Lehrstuhl fuer Numerische Mathematik RWTH - Aachen University D 52056 Aachen, Germany -- http://mail.python.org/mailman/listinfo/python-list