Como Deduplicar uma Lista em Python

Aliaksei Yursha 30 janeiro 2023
  1. Deduplicar uma Lista Python sem Preservar a Ordem
  2. Deduplicar uma lista Python com ordem de preservação
Como Deduplicar uma Lista em Python

Às vezes em Python, temos uma lista de valores, entre os quais alguns são duplicados.
É um caso de uso diário para remover todas as duplicatas da lista, de modo que
todos os valores restantes na lista são únicos.

Podemos conseguir isso usando diferentes métodos, alguns dos quais preservam o
ordem original dos elementos, enquanto outros não.

Deduplicar uma Lista Python sem Preservar a Ordem

Se não for um requisito para preservar a ordem original,
podemos deduplicar uma lista utilizando a estrutura de dados set embutida.
O set é uma estrutura de dados que só pode conter elementos únicos por projeto.

Construindo tal set a partir de nossa lista inicial, todos os elementos duplicados
são ignoradas.
Então podemos converter o array de volta em uma lista e obter uma lista de elementos únicos.

Infelizmente, a ordem dos elementos muda, uma vez que a deduplicação
A funcionalidade da estrutura de dados set é implementada utilizando tabelas hash, que
não se lembram que elementos foram inseridos primeiro.

>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique_set = set(names)
>>> unique_list = list(unique_set)
>>> unique_list
['Stacy', 'Sarah', 'Jim', 'Bob']

Se você usar o pacote NumPy para computação científica em Python,
você também pode empregar a função numpy.unique().

>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim'] 
>>> numpy.unique(names).tolist()
['Bob', 'Jim', 'Sarah', 'Stacy']

Note que o método acima também não preserva a ordem dos elementos originais.
O modo NumPy de preservação de ordem está mais envolvido, e você pode encontrá-lo abaixo.

Deduplicar uma lista Python com ordem de preservação

Uma solução simples, que permite preservar a ordem inicial, é utilizar um laço duplo para cada laço.

O primeiro laço atravessa todos os elementos da lista original.
O segundo laço verifica se já vimos um elemento com o mesmo valor.

Se não vimos, adicionamo-lo à lista única, que, no final,
conterá elementos únicos na ordem original.

>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = []
>>> for name in names:         # 1st loop
...   if name not in unique:   # 2nd loop
...     unique.append(name)
...
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']

Outra forma de deduplicar uma lista, preservando a ordem original, é usar
a estrutura de dados collections.OrderedDict.
OrderedDict é um tipo especial de estrutura de dados de dicionário em Python, que
lembra-se da ordem de inserção da chave.

>>> from collections import OrderedDict
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = list(OrderedDict.fromkeys(names))
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']

Se você usa Pandas biblioteca de análise de dados Python,
andas.unique também pode ser útil. Este método é de preservação de ordem.

>>> import pandas
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> pandas.unique(names).tolist()
['Bob', 'Stacy', 'Sarah', 'Jim']

A maneira de um NumPy deduplicar uma lista enquanto preserva a ordem é um pouco mais complicada.
Você tem que lembrar de um índice de cada elemento distinto e depois recriar uma lista única
do original, usando tais índices.

>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> _, indexes = numpy.unique(names, return_index=True)
>>> unique = [names[i] for i in numpy.sort(indexes)]
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']

Artigo relacionado - Python List