Il modo più conveniente "Pythonic" per rimuovere i duplicati da una lista è fondamentalmente:rimuovendo i duplicati che utilizzano i confronti personalizzati
mylist = list(set(mylist))
Ma supponiamo che i tuoi criteri per il conteggio di un duplicato dipende da un particolare campo membro degli oggetti contenuti in mylist
.
Beh, una soluzione è quella di definire solo __eq__
e __hash__
per gli oggetti in mylist
, e poi il classico list(set(mylist))
funzionerà.
Ma a volte ci sono requisiti che richiedono un po 'più di flessibilità. Sarebbe molto comodo poter creare on-the-fly lambdas per utilizzare routine di confronto personalizzate per identificare i duplicati in modi diversi. Idealmente, qualcosa come:
mylist = list(set(mylist, key = lambda x: x.firstname))
Naturalmente, che in realtà non funziona perché il costruttore set
non ci vuole un funzione di confronto, e set
richiede chiavi hashable pure.
Quindi qual è il modo più vicino per ottenere qualcosa del genere, in modo da poter rimuovere i duplicati utilizzando funzioni di confronto arbitrarie?
Questo è il modo generalmente più semplice per procedere con questo. E le prestazioni dovrebbero essere quasi uguali al metodo impostato. – Chronial
Wow Non ho mai visto la sintassi '{x.firstname: x per x in mylist}' prima. Come si chiama e dove posso trovarlo nei documenti. –
@MarwanAlsabbagh: È una [dict comprehension] (http://www.python.org/dev/peps/pep-0274/). E 'stato aggiunto in Python 2.7 e 3.0. È equivalente a 'dict ((x.firstname, x) per x in mylist)'. – interjay