Come deduplicare una lista in Python

Aliaksei Yursha 25 giugno 2020
  1. Deduplicare una lista di Python senza conservare l’ordine
  2. Deduplicare una lista di Python con ordine di conservazione
Come deduplicare una lista in Python

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