2010-10-22 12 views
5

En eski öğeyi korurken yinelenenleri kaldırmak için sitede bir çok çözüm gördüm. Bunun tersine ilgi duyuyorum: en yeni öğeyi korurken kopyaları silme, örneğin:Siparişi koruyarak ve en eski öğeyi silerken Python listesinden çiftleri kaldırmanın en verimli yolu

list = ['1234','2345','3456','1234'] 
list.append('1234') 
>>> ['1234','2345','3456','1234','1234'] 
list = unique(list) 
>>> ['2345','3456','1234'] 

Böyle bir şey nasıl çalışır?

Teşekkürler.

+1

Eh, diğer cevaplar söylediklerini yapın listeyi ters ve tekrar ters olabilir. – JoshD

+1

Listeyi 'reversed() 'ile tersine çevirmeye çalışın, sonra başka bir yerde anlatıldığı gibi yapın ve sonra tekrar tersine çevirin. – eumiro

cevap

3

, hashable olmaya öğeleri (veya anahtarları) gerektirir liste-sever üzerinde yerinde çalışır:

def inplace_unique_latest(L, key=None): 
    if key is None: 
    def key(x): 
     return x 
    seen = set() 
    n = iter(xrange(len(L) - 1, -2, -1)) 
    for x in xrange(len(L) - 1, -1, -1): 
    item = L[x] 
    k = key(item) 
    if k not in seen: 
     seen.add(k) 
     L[next(n)] = item 
    L[:next(n) + 1] = [] 
+1

Yanlış okuyor olabilirim, ama listeden attığınız zaman [x] 'nin yanlış olduğunu görmeyecek misiniz? Her şey değiştiği için yanlış öğeyi patlatacak mısın? – bstpierre

+0

@bstpierre: Güzel yakalama; sabit. –

İlgili konular