2010-10-22 20 views
5

Widziałem kilka rozwiązań na miejscu, aby usunąć duplikaty zachowując najstarszy element. Interesuje mnie coś odwrotnego: usuwanie duplikatów przy zachowaniu najnowszego elementu, na przykład:najbardziej efektywny sposób, aby usunąć duplikaty z listy w Pythonie zachowując kolejność i usuwanie najstarszego elementu

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

Jak coś takiego działa?

Dzięki.

+1

Cóż, można odwrócić listy, robić to, co inne odpowiedzi powiedział, i odwrócić go ponownie. – JoshD

+1

Spróbuj odwrócić listę 'odwrócone()', następnie zrób to jak opisano w innym miejscu, a następnie odwrócić go ponownie. – eumiro

Odpowiedz

3

Wymaga przedmioty (lub klucze) do hashable, pracuje w miejscu na liście-lubi:

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

I może być czytanie to źle, ale nie będzie postrzegane '[x]' być źle kiedy już wpadliśmy z listy? W efekcie pojawi się niewłaściwy przedmiot, ponieważ wszystko się zmieniło? – bstpierre

+0

@bstpierre: Niezły chwyt; naprawiony. –

Powiązane problemy