
Questo articolo descrive come verificare se sono presenti elementi duplicati (= se tutti gli elementi sono univoci) in un elenco in Python per i seguenti casi:
- L’elenco non contiene oggetti non modificabili
- L’elenco contiene oggetti non modificabili
Vedere l’articolo seguente per rimuovere o estrarre elementi duplicati dall’elenco.
Controlla se l’elenco contiene elementi duplicati (non ci sono oggetti non modificabili)
Usa set() se l’elenco non contiene oggetti non modificabili come elenco. Passando un elenco a set(), aggiunge set, che ignora i valori duplicati e conserva solo i valori univoci come elementi.
Ottieni il numero di elementi originali di questo set e l’elenco con la funzione incorporata len() e confronta.
Se il numero di elementi è lo stesso, significa che non ci sono elementi duplicati nell’elenco originale e se il numero di elementi è diverso, significa che l’elenco originale contiene elementi duplicati.
La funzione che ripete False quando non ci sono elementi duplicati e True quando ci sono elementi duplicati è la seguente:
def has_duplicates(seq):
return len(seq) != len(set(seq))
l = [0, 1, 2]
print(has_duplicates(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates(l))
# True
Il codice di esempio sopra usa list, ma la stessa funzione può essere usata con tuple.
Poiché set non può contenere oggetti non hashable come list, si verificherà un errore TypeError per un elenco contenente un elenco (elenco bidimensionale, elenco di elenchi).
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Controlla se l’elenco contiene elementi duplicati (c’è un oggetto non hashable)
Nel caso di una lista comprendente una lista, è possibile verificare se vi sono elementi duplicati mediante la seguente funzione:
def has_duplicates2(seq):
seen = []
unique_list = [x for x in seq if x not in seen and not seen.append(x)]
return len(seq) != len(unique_list)
l_2d = [[0, 0], [0, 1], [1, 1], [1, 0]]
print(has_duplicates2(l_2d))
# False
l_2d = [[0, 0], [0, 1], [1, 1], [1, 1]]
print(has_duplicates2(l_2d))
# True
Genera un elenco contenente solo valori univoci utilizzando la comprensione dell’elenco anziché set() e confrontare il numero di elementi. Vedere il seguente articolo per i dettagli.
Questa funzione funzione anche per elenchi che non contengono oggetti non modificabili come elenchi.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
L’esempio precedente controlla se l’elenco contiene lo stesso elenco. È possibile verificare se gli elementi in ogni elenco sono duplicati appiattendo l’elenco originale a una dimensione e quindi verificare se sono duplicati.
l_2d = [[0, 1], [2, 3]]
print(sum(l_2d, []))
# [0, 1, 2, 3]
print(has_duplicates(sum(l_2d, [])))
# False
l_2d = [[0, 1], [2, 0]]
print(has_duplicates(sum(l_2d, [])))
# True
In questo esempio, sum() viene per appiattare l’elenco, ma puoi anche usare itertools.chain.from_iterable(). Se vuoi appaiare un elenco con più di tre dimensioni, devi definire una nuova funzione. Vedi il seguente articolo.