Come deduplicare una lista in Python

  1. Deduplicare una lista di Python senza conservare l’ordine
  2. 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 ciclo.

Il primo ciclo attraversa tutti gli elementi della lista originale. Il secondo ciclo 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

  • Rimuovi i duplicati dall'lista in Python
  • Converti un dizionario in una lista in Python