Determinare se una lista (array) ha elementi duplicati in Python

Attività commerciale

La seguente è una descrizione di come determinare se una lista (array) ha elementi duplicati (tutti gli elementi sono unici) in Python, per ciascuno dei seguenti casi.

  • Per una lista senza elenco nell'elemento
  • Per liste con liste di elementi (matrici bidimensionali, liste di liste, ecc.)

Vedi il seguente articolo su come rimuovere o estrarre elementi duplicati da una lista.

Notate che le liste possono memorizzare diversi tipi di dati e sono strettamente diverse dagli array. Se volete gestire gli array in processi che richiedono dimensioni e indirizzi di memoria o l'elaborazione numerica di grandi dati, usate array (libreria standard) o NumPy.

Determinare se ci sono elementi duplicati nella lista (se l'elemento non ha una lista)

Se l'elemento non ha un oggetto aggiornabile come una lista, usate il costruttore set() del tipo set.

Il tipo set è un tipo di dati che non ha elementi duplicati. Quando una lista viene passata al costruttore set(), i valori duplicati vengono ignorati e viene restituito un oggetto di tipo set con solo valori unici come elementi.

Il numero di elementi in questo oggetto di tipo set e la lista originale sono ottenuti e confrontati utilizzando la funzione built-in len().

  • Se il numero di elementi è uguale, non ci sono elementi duplicati nella lista originale
  • Gli elementi duplicati sono inclusi nella lista originale se il numero di elementi è diverso

Le funzioni che restituiscono falso se non ci sono elementi duplicati e vero se ci sono elementi duplicati sono le seguenti

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

L'esempio è una lista, ma la stessa funzione può essere usata con le tuple.

Gli oggetti mutabili (aggiornabili) come le liste non possono essere elementi del tipo set. Pertanto, gli elenchi con liste come elementi (array bidimensionali, liste di liste, ecc.) risulteranno in un TypeError. La contromisura è mostrata di seguito.

l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'

Determinare se ci sono elementi duplicati nella lista (se l'elemento ha una lista)

Nel caso di una lista con un elenco di elementi (come una lista di liste), le seguenti funzioni possono essere utilizzate per determinare se ci sono elementi duplicati.

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

Invece di set(), la notazione di comprensione della lista genera una lista i cui elementi sono solo valori unici, e il numero di elementi viene confrontato. Vedere il seguente articolo per i dettagli.

Questa funzione è valida anche per le liste che non hanno una lista di elementi.

l = [0, 1, 2]
print(has_duplicates2(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True

L'esempio finora è la determinazione se la lista di elementi è duplicata (contiene la stessa lista).

Se gli elementi di ogni lista si sovrappongono può essere determinato dopo aver appiattito la lista originale ad una dimensione.

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

Qui si usa sum() per appiattire la lista, ma si può usare anche itertools.chain.from_iterable(). Inoltre, quando si appiattisce una lista di tre o più dimensioni, è necessario definire una nuova funzione.