2010-10-22 14 views
5

Ho visto un sacco di soluzioni sul sito per rimuovere i duplicati preservando l'elemento più vecchio. Mi interessa l'opposto: rimuovere i duplicati preservando l'elemento più nuovo, ad esempio:Il modo più efficace per rimuovere i duplicati dall'elenco Python preservando l'ordine e rimuovendo l'elemento più vecchio

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

Come funziona qualcosa del genere?

Grazie.

+1

Beh, si potrebbe invertire la lista, fare ciò che ha detto che le altre risposte, e invertire di nuovo. – JoshD

+1

Prova ad invertire l'elenco con 'reverseed()', quindi eseguilo come descritto altrove e poi invertilo di nuovo. – eumiro

risposta

3

Richiede gli elementi (o chiavi) per essere hashable, lavora in-place on list-gusti:

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

Forse sto leggendo male, ma non sarò 'visto [x]' essere sbagliato una volta che hai estratto dalla lista? Finirai per aprire l'oggetto sbagliato perché tutto è cambiato? – bstpierre

+0

@bstpierre: bella presa; fisso. –

Problemi correlati