Cómo determinar si una lista (array) tiene elementos duplicados en Python

Negocio

A continuación se describe cómo determinar si una lista (array) tiene elementos duplicados (todos los elementos son únicos) en Python, para cada uno de los siguientes casos.

  • Para una lista que no tiene ningún elemento
  • Para listas con elementos (matrices bidimensionales, listas de listas, etc.)

Consulte el siguiente artículo sobre cómo eliminar o extraer elementos duplicados de una lista.

Tenga en cuenta que las listas pueden almacenar diferentes tipos de datos y son estrictamente diferentes de los arrays. Si quieres manejar arrays en procesos que requieren tamaño de memoria y direcciones de memoria o procesamiento numérico de grandes datos, utiliza array (biblioteca estándar) o NumPy.

Determinar si hay elementos duplicados en la lista (si el elemento no tiene lista)

Si el elemento no tiene un objeto actualizable como una lista, utilice el constructor set() del tipo set.

El tipo set es un tipo de datos que no tiene elementos duplicados. Cuando se pasa una lista al constructor set(), se ignoran los valores duplicados y se devuelve un objeto de tipo set con sólo valores únicos como elementos.

El número de elementos en este objeto de tipo conjunto y la lista original se obtienen y se comparan utilizando la función incorporada len().

  • Si el número de elementos es igual, no hay elementos duplicados en la lista original
  • Los elementos duplicados se incluyen en la lista original si el número de elementos es diferente

Las funciones que devuelven false si no hay elementos duplicados y true si hay elementos duplicados son las siguientes

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

El ejemplo es una lista, pero la misma función puede utilizarse con tuplas.

Los objetos mutables (actualizables) como las listas no pueden ser elementos del tipo set. Por lo tanto, las listas con listas como elementos (arrays bidimensionales, listas de listas, etc.) darán lugar a un TypeError. La contramedida se muestra a continuación.

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

Determinar si hay elementos duplicados en la lista (si el elemento tiene una lista)

En el caso de una lista con una lista de elementos (como una lista de listas), se pueden utilizar las siguientes funciones para determinar si hay 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(), la notación de comprensión de listas genera una lista cuyos elementos son sólo valores únicos, y el número de elementos se compara. Consulte el siguiente artículo para obtener más detalles.

Esta función también es válida para las listas que no tienen una lista de elementos.

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

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

El ejemplo hasta ahora es la determinación de si la lista de elementos está duplicada (contiene la misma lista).

Se puede determinar si los elementos de cada lista se solapan después de aplanar la lista original a una 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í se utiliza sum() para aplanar la lista, pero también se puede utilizar itertools.chain.from_iterable(). Además, cuando se aplana una lista de tres o más dimensiones, es necesario definir una nueva función.

Copied title and URL