Come deduplicare una lista in Python
- Deduplicare una lista di Python senza conservare l’ordine
- Deduplicare una lista di Python con ordine di conservazione
A volte in Python abbiamo una lista di valori, tra cui alcuni sono duplicati.
È un caso di uso quotidiano per rimuovere tutti i duplicati dalla lista, in modo che
tutti i valori rimanenti nella lista sono unici.
Possiamo ottenere questo risultato utilizzando diversi metodi, alcuni dei quali conservano la
ordine originale degli elementi, mentre altri non lo fanno.
Deduplicare una lista di Python senza conservare l’ordine
Se non è un requisito per preservare l’ordine originale,
possiamo deduplicare una lista usando la struttura dei dati set
incorporata.
Il set
è una struttura di dati che può contenere solo elementi unici per design.
Costruendo tale set
dalla nostra lista iniziale, tutti gli elementi duplicati
sono ignorati.
Poi possiamo convertire il set in una lista e otterremo una lista di elementi unici.
Sfortunatamente, l’ordine degli elementi cambia, poiché deduplicare
La funzionalità della struttura dei dati set
è implementata utilizzando le tabelle di hash, che
non ricordate quali elementi sono stati inseriti per primi.
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique_set = set(names)
>>> unique_list = list(unique_set)
>>> unique_list
['Stacy', 'Sarah', 'Jim', 'Bob']
Se si utilizza il pacchetto NumPy per il calcolo scientifico in Python,
si può anche utilizzare la funzione numpy.unique()
.
>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> numpy.unique(names).tolist()
['Bob', 'Jim', 'Sarah', 'Stacy']
Si noti che il metodo di cui sopra non conserva nemmeno l’ordine originale degli elementi.
Il metodo NumPy
, che conserva l’ordine, è più coinvolto, e lo potete trovare qui sotto.
Deduplicare una lista di Python con ordine di conservazione
Una soluzione semplice, che permette di conservare l’ordine iniziale, è quella di utilizzare un doppio per ogni bucle.
Il primo bucle attraversa tutti gli elementi della lista originale.
Il secondo bucle controlla se abbiamo già visto un elemento con lo stesso valore.
Se non l’abbiamo visto, lo aggiungiamo alla lista unique
, che, alla fine,
conterrà elementi unici nell’ordine originale.
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = []
>>> for name in names: # 1st loop
... if name not in unique: # 2nd loop
... unique.append(name)
...
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']
Un altro modo per deduplicare una lista preservando l’ordine originale è quello di utilizzare
la struttura dei dati collezioni.OrderedDict
.
OrderedDict
è un tipo speciale di struttura di dati del dizionario in Python, che
ricorda l’ordine di inserimento della chiave.
>>> from collections import OrderedDict
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = list(OrderedDict.fromkeys(names))
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']
Se si utilizza la libreria di analisi dei dati Python Pandas,
Anche i pandas.unique
possono essere utili. Questo metodo è di mantenimento dell’ordine.
>>> import pandas
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> pandas.unique(names).tolist()
['Bob', 'Stacy', 'Sarah', 'Jim']
Un modo di NumPy per deduplicare una lista preservando l’ordine è un po’ più complicato.
Bisogna ricordare un indice di ogni elemento distinto e poi ricreare una lista unica
da quello originale usando tali indici.
>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> _, indexes = numpy.unique(names, return_index=True)
>>> unique = [names[i] for i in numpy.sort(indexes)]
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']
Articolo correlato - Python List
- Converti un dizionario in una lista in Python
- Rimuovi i duplicati dall'lista in Python
- Rimuovi tutte le occorrenze di un elemento da una lista in Python
- Ottieni la media di una lista in Python
- Qual è la differenza tra i metodi di elencazione, aggiungere ed estendere
- Come convertire una lista in stringa in Python