Determinar se unha lista (matriz) ten elementos duplicados en Python

Negocios

A seguinte é unha descrición de como determinar se unha lista (matriz) ten elementos duplicados (todos os elementos son únicos/únicos) en Python, para cada un dos seguintes casos.

  • Para unha lista sen lista no elemento
  • Para listas con listas de elementos (matrices bidimensionais, listas de listas, etc.)

Consulta o seguinte artigo sobre como eliminar ou extraer elementos duplicados dunha lista.

Teña en conta que as listas poden almacenar diferentes tipos de datos e son estrictamente diferentes das matrices. Se quere manexar matrices en procesos que requiren tamaño de memoria e enderezos de memoria ou procesamento numérico de grandes datos, use array (biblioteca estándar) ou NumPy.

Determina se hai elementos duplicados na lista (se o elemento non ten lista)

Se o elemento non ten un obxecto actualizable como unha lista, use o construtor set() do tipo set set.

O tipo de conxunto é un tipo de datos que non ten elementos duplicados. Cando se pasa unha lista ao construtor set(), ignóranse os valores duplicados e devólvese un obxecto de tipo definido con só valores únicos como elementos.

O número de elementos deste obxecto de tipo conxunto e a lista orixinal obtéñense e compáranse mediante a función integrada len().

  • Se o número de elementos é igual, non hai elementos duplicados na lista orixinal
  • Os elementos duplicados inclúense na lista orixinal se o número de elementos é diferente

As funcións que devolven false se non hai elementos duplicados e true se hai elementos duplicados son as seguintes

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

O exemplo é unha lista, pero a mesma función pódese usar con tuplas.

Os obxectos mutables (actualizables), como listas, non poden ser elementos do conxunto de tipos. Polo tanto, as listas con listas como elementos (matrices bidimensionais, listas de listas, etc.) darán lugar a un TypeError. A contramedida móstrase a continuación.

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

Determina se hai elementos duplicados na lista (se o elemento ten unha lista)

No caso dunha lista cunha lista de elementos (como unha lista de listas), pódense utilizar as seguintes funcións para determinar se hai elementos duplicados.

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 lugar de set(), a notación de comprensión da lista xera unha lista cuxos elementos son só valores únicos e compárase o número de elementos. Consulte o seguinte artigo para obter máis detalles.

Esta función tamén é válida para listas que non teñen unha lista de elementos.

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

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

O exemplo ata agora é a determinación de se a lista de elementos está duplicada (contén a mesma lista).

Pódese determinar se os elementos de cada lista se superpoñen despois de aplanar a lista orixinal a unha dimensión.

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í úsase sum() para aplanar a lista, pero tamén se pode usar itertools.chain.from_iterable(). Ademais, ao aplanar unha lista de tres ou máis dimensións, é necesario definir unha nova función.

Copied title and URL