Determinar si una llista (matriu) té elements duplicats a Python

Negocis

A continuació es mostra una descripció de com determinar si una llista (matriu) té elements duplicats (tots els elements són únics/únics) a Python, per a cadascun dels casos següents.

  • Per a una llista sense llista a l’element
  • Per a llistes amb llistes d’elements (matrius bidimensionals, llistes de llistes, etc.)

Consulteu l’article següent sobre com eliminar o extreure elements duplicats d’una llista.

Tingueu en compte que les llistes poden emmagatzemar diferents tipus de dades i són estrictament diferents de les matrius. Si voleu gestionar matrius en processos que requereixen mida de memòria i adreces de memòria o processament numèric de dades grans, utilitzeu array (biblioteca estàndard) o NumPy.

Determinar si hi ha elements duplicats a la llista (si l’element no té cap llista)

Si l’element no té un objecte actualitzable, com ara una llista, utilitzeu el constructor set() del tipus set set.

El tipus de conjunt és un tipus de dades que no té elements duplicats. Quan es passa una llista al constructor set(), els valors duplicats s’ignoren i es retorna un objecte de tipus establert amb només valors únics com a elements.

El nombre d’elements d’aquest objecte de tipus conjunt i la llista original s’obtenen i es comparen mitjançant la funció integrada len().

  • Si el nombre d’elements és igual, no hi ha elements duplicats a la llista original
  • Els elements duplicats s’inclouen a la llista original si el nombre d’elements és diferent

Les funcions que retornen fals si no hi ha elements duplicats i true si hi ha elements duplicats són les següents

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’exemple és una llista, però la mateixa funció es pot utilitzar amb tuples.

Els objectes mutables (actualitzables), com ara llistes, no poden ser elements de tipus conjunt. Per tant, les llistes amb llistes com a elements (matrius bidimensionals, llistes de llistes, etc.) donaran lloc a un TypeError. La contramesura es mostra a continuació.

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

Determinar si hi ha elements duplicats a la llista (si l’element té una llista)

En el cas d’una llista amb una llista d’elements (com ara una llista de llistes), es poden utilitzar les funcions següents per determinar si hi ha elements duplicats.

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

En lloc de set(), la notació de comprensió de la llista genera una llista els elements de la qual només són valors únics i es compara el nombre d’elements. Consulteu l’article següent per obtenir més informació.

Aquesta funció també és vàlida per a llistes que no tenen una llista d’elements.

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

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

L’exemple fins ara és la determinació de si la llista d’elements està duplicada (conté la mateixa llista).

Es pot determinar si els elements de cada llista es superposen després d’aplanar la llista original a una dimensió.

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

Aquí, sum() s’utilitza per aplanar la llista, però també es pot utilitzar itertools.chain.from_iterable(). A més, en aplanar una llista de tres o més dimensions, cal definir una nova funció.

Copied title and URL