HOWTO · Python

Ottieni valori univoci da una lista in Python

L'articolo introduce metodi per ottenere valori univoci da una lista in Python

In questa pagina

Per ottenere valori univoci da una lista Python con Python 3.7 o versioni successive, usa list(dict.fromkeys(values)) se gli elementi sono hashable e vuoi mantenere l’ordine della prima occorrenza. Se gli elementi non sono hashable, usa un ciclo con una lista dei risultati. Converti la lista in set(values) solo quando l’ordine non è importante.

Ottenere valori univoci mantenendo l’ordine con dict.fromkeys()

dict.fromkeys() crea un dizionario le cui chiavi provengono dall’iterabile di input. Le chiavi di un dizionario sono univoche e, da Python 3.7 in poi, i dizionari mantengono l’ordine di inserimento. Convertire nuovamente le chiavi in una lista elimina quindi i duplicati e conserva la posizione della prima occorrenza di ciascun valore. Questo metodo richiede che ogni elemento sia hashable, come accade in generale per le chiavi dei dizionari.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

values = ["pear", "apple", "pear", "plum", "apple"]
unique_values = list(dict.fromkeys(values))
print(unique_values)

Output:

['pear', 'apple', 'plum']

Ottenere valori univoci mantenendo l’ordine con un ciclo

Quando i valori non sono hashable, come nel caso di liste annidate, un dizionario o un set non può usarli come chiavi o elementi. Un ciclo esplicito può invece confrontare ogni valore con quelli già raccolti. Mantiene la prima occorrenza e funziona con liste di valori i cui confronti di uguaglianza hanno significato.

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

values = [[1, 2], [3, 4], [1, 2]]
unique_values = []
for value in values:
    if value not in unique_values:
        unique_values.append(value)
print(unique_values)

Ogni controllo value not in unique_values esamina la lista dei risultati. Quando aumenta il numero di elementi distinti, i confronti ripetuti possono rendere questo approccio più lento dei metodi basati su hashing. Usalo quindi quando poter gestire elementi non hashable è più importante della velocità.

Ottenere valori univoci con set() quando l’ordine non è importante

Per gli elementi hashable, set(values) elimina i duplicati in modo conciso. Un set non mantiene l’ordine della lista di input, quindi quando lo riconverti in lista non fare affidamento su una sequenza specifica. Anche gli elementi di un set devono essere hashable. Scegli questa opzione quando l’ordine non conta, per esempio per verificare l’appartenenza o confrontare quali valori sono presenti.

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

values = ["pear", "apple", "pear", "plum", "apple"]
unique_values = set(values)
print(unique_values)

L’ordine visualizzato del set può variare: il risultato contiene i valori distinti, ma non è garantito un particolare ordine di stampa.

Scegliere un metodo per la propria lista

Scegli dict.fromkeys() per ottenere una lista concisa che mantiene la prima occorrenza di ogni valore hashable. Scegli il ciclo esplicito se i valori potrebbero non essere hashable, per esempio se sono liste, e l’ordine della prima occorrenza è importante. Scegli set() quando i valori sono hashable e l’ordine non ha importanza.

Con input hashable, in genere l’appartenenza a dizionari e set è efficiente in media, mentre il ciclo cerca ripetutamente nella lista dei risultati, che diventa via via più lunga. Questi metodi determinano i duplicati in base alle regole di uguaglianza e hashing di Python: valori uguali, come 1 e True, risultano uguali nel confronto e vengono ridotti a un solo elemento. Se l’applicazione richiede una nozione diversa di unicità, normalizza gli elementi o ricava una chiave per ciascuno, poi rimuovi i duplicati usando quella chiave.