Segue-se uma descrição de como determinar se uma lista (matriz) tem elementos duplicados (todos os elementos são únicos\únicos) em Python, para cada um dos seguintes casos
- Para uma lista sem lista no elemento
- Para listas com listas de elementos (matrizes bidimensionais, listas de listas, etc.)
Ver o artigo seguinte sobre como remover ou extrair elementos duplicados de uma lista.
Note-se que as listas podem armazenar diferentes tipos de dados e são estritamente diferentes das arrays. Se quiser tratar arrays em processos que requerem tamanho de memória e endereços de memória ou processamento numérico de dados grandes, utilize array (biblioteca padrão) ou NumPy.
Determinar se existem elementos duplicados na lista (se o elemento não tem lista)
Se o elemento não tiver um objecto actualizável tal como uma lista, utilizar o conjunto construtor() do tipo set set.
O tipo de conjunto é um tipo de dados que não tem elementos duplicados. Quando uma lista é passada para o conjunto construtor(), os valores duplicados são ignorados e um objecto de tipo definido apenas com valores únicos como elementos é devolvido.
O número de elementos neste conjunto tipo de objecto e a lista original são obtidos e comparados utilizando a função len() integrada.
- Se o número de elementos for igual, não há elementos duplicados na lista original
- Os elementos duplicados são incluídos na lista original se o número de elementos for diferente
Funções que retornam falsos se não houver elementos duplicados e verdadeiros se houver elementos duplicados são 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 é uma lista, mas a mesma função pode ser usada com tuplos.
Objectos mutáveis (actualizáveis) tais como listas não podem ser elementos do tipo conjunto. Portanto, listas com listas como elementos (matrizes bidimensionais, listas de listas, etc.) resultarão num TypeError. A contra-medida é mostrada abaixo.
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Determinar se existem elementos duplicados na lista (se o elemento tem uma lista)
No caso de uma lista com uma lista de elementos (tal como uma lista de listas), as seguintes funções podem ser utilizadas para determinar se existem 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
Em vez de set(), a notação de compreensão de lista gera uma lista cujos elementos são apenas valores únicos, e o número de elementos é comparado. Ver o artigo seguinte para detalhes.
Esta função é também válida para listas que não têm uma lista de elementos.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
O exemplo até agora é a determinação se a lista de elementos é duplicada (contém a mesma lista).
Se os elementos de cada lista se sobrepõem podem ser determinados após aplanar a lista original para uma dimensão.
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
Aqui, sum() é utilizado para aplanar a lista, mas itertools.chain.from_iterable() também pode ser utilizado. Além disso, ao aplanar uma lista de três ou mais dimensões, é necessário definir uma nova função.