Determinarea dacă o listă (array) are elemente duplicate în Python

Afaceri

În cele ce urmează este descrisă modalitatea de a determina dacă o listă (matrice) are elemente duplicate (toate elementele sunt unice) în Python, pentru fiecare dintre următoarele cazuri.

  • Pentru o listă fără listă în elementul
  • Pentru liste cu liste de elemente (matrici bidimensionale, liste de liste, etc.)

Consultați următorul articol despre cum să eliminați sau să extrageți elementele duplicate dintr-o listă.

Rețineți că listele pot stoca diferite tipuri de date și sunt strict diferite de array-uri. Dacă doriți să manipulați array-uri în procese care necesită dimensiunea memoriei și adrese de memorie sau procesarea numerică a unor date mari, utilizați array (biblioteca standard) sau NumPy.

Determinați dacă există elemente duplicate în listă (dacă elementul nu are o listă)

În cazul în care elementul nu are un obiect actualizabil, cum ar fi o listă, se utilizează constructorul set() al tipului set set.

Tipul set este un tip de date care nu are elemente duplicate. Atunci când o listă este transmisă constructorului set(), valorile duplicate sunt ignorate și se returnează un obiect de tip set având ca elemente doar valori unice.

Numărul de elemente din acest obiect de tip set și din lista originală sunt obținute și comparate cu ajutorul funcției încorporate len().

  • Dacă numărul de elemente este egal, nu există elemente duplicate în lista originală.
  • Elementele duplicate sunt incluse în lista originală dacă numărul de elemente este diferit.

Funcțiile care returnează false dacă nu există elemente duplicate și true dacă există elemente duplicate sunt următoarele

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

Exemplul este o listă, dar aceeași funcție poate fi utilizată și cu tupluri.

Obiectele mutabile (care pot fi actualizate), cum ar fi listele, nu pot fi elemente de tip set. Prin urmare, listele cu liste ca elemente (matrice bidimensională, liste de liste etc.) vor genera o eroare de tip TypeError. Contramăsura este prezentată mai jos.

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

Determinați dacă există elemente duplicate în listă (dacă elementul are o listă)

În cazul unei liste cu o listă de elemente (cum ar fi o listă de liste), următoarele funcții pot fi utilizate pentru a determina dacă există elemente duplicate.

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

În loc de set(), notația de înțelegere a listei generează o listă ale cărei elemente sunt numai valori unice, iar numărul de elemente este comparat. Pentru detalii, consultați următorul articol.

Această funcție este valabilă și pentru listele care nu au o listă de elemente.

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

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

Exemplul de până acum este determinarea dacă lista de elemente este duplicată (conține aceeași listă).

Se poate determina dacă elementele fiecărei liste se suprapun după aplatizarea listei originale la o singură dimensiune.

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

Aici, sum() este utilizat pentru a aplatiza lista, dar se poate folosi și itertools.chain.from_iterable(). În plus, atunci când se aplatizează o listă cu trei sau mai multe dimensiuni, este necesar să se definească o nouă funcție.

Copied title and URL