Removendo Duplicatas em Python: Um Guia Completo
Aprenda cinco formas práticas de remover duplicatas de uma lista Python — set, dict.fromkeys, loop com seen set, list comprehension e Counter.
Valores duplicados em uma lista Python são comuns ao coletar entradas do usuário, mesclar conjuntos de dados ou ler arquivos. Este guia aborda cinco técnicas práticas para remover duplicatas — cada uma com uma relação de compromisso diferente entre velocidade, preservação de ordem e legibilidade.
| Método | Preserva a ordem | Funciona com itens não hasháveis | Legível |
|---|---|---|---|
set() | Não | Não | Sim |
dict.fromkeys() | Sim (Python 3.7+) | Não | Sim |
| Loop com seen set | Sim | Não | Médio |
| List comprehension | Sim | Não | Médio |
Counter (encontra dups) | Sim | Não | Sim |
Usando set() para Remover Duplicatas
Converter uma lista em um set é a forma mais rápida e concisa de remover duplicatas. Um set armazena apenas valores únicos e hasháveis, portanto quaisquer duplicatas são descartadas automaticamente.
Saída (a ordem pode variar):
[1, 2, 3, 4, 5]Quando usar: a ordem não importa e a lista contém apenas elementos hasháveis (números, strings, tuplas).
Atenção: sets não são ordenados. Embora sets de inteiros pequenos frequentemente sejam impressos em ordem crescente, não se pode depender disso. Se a ordem for importante, use um dos métodos abaixo.
Usando dict.fromkeys() para Preservar a Ordem
dict.fromkeys() cria um dicionário cujas chaves são os elementos da lista. Como as chaves de dicionário são únicas e, desde Python 3.7, mantêm a ordem de inserção, isso remove duplicatas preservando a ordem original.
Saída:
[1, 2, 3, 4, 5]Esta é a solução idiomática em uma linha para deduplicação com preservação de ordem no Python moderno (3.7+). Ela também é ligeiramente mais rápida do que um loop explícito, pois as operações de dicionário ocorrem em C.
Usando um Loop com um Seen Set
Quando você quer controle total — por exemplo, para registrar duplicatas ignoradas ou aplicar lógica de igualdade personalizada — um loop explícito é a abordagem mais clara.
def remove_duplicates(lst):
seen = set()
result = []
for item in lst:
if item not in seen:
seen.add(item)
result.append(item)
return result
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
print(remove_duplicates(my_list))Saída:
[3, 1, 4, 5, 9, 2, 6]Isso preserva a ordem de inserção e é executado em tempo O(n) — a verificação in em um set é O(1). Compare isso com a verificação if item not in result, que é O(n) por elemento e torna toda a função O(n²).
Usando List Comprehension
Você pode escrever o mesmo padrão com seen set em uma única linha usando uma list comprehension. O truque é que set.add() sempre retorna None (falso), portanto not (x in seen or seen.add(x)) é True apenas na primeira vez que cada valor aparece.
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]
seen = set()
unique = [x for x in my_list if not (x in seen or seen.add(x))]
print(unique)Saída:
[3, 1, 4, 5, 9, 2, 6]Isso é compacto, mas depende de um efeito colateral dentro da comprehension, o que pode surpreender leitores. O loop explícito acima é geralmente preferido em código de equipe.
Usando Counter para Encontrar Quais Valores São Duplicados
Às vezes você precisa saber quais valores aparecem mais de uma vez, em vez de simplesmente removê-los. collections.Counter conta as ocorrências e torna isso simples.
from collections import Counter
my_list = [1, 2, 2, 3, 4, 4, 5, 5, 5]
counts = Counter(my_list)
print(counts)
duplicates = [item for item, count in counts.items() if count > 1]
print("Duplicated values:", duplicates)Saída:
Counter({5: 3, 2: 2, 4: 2, 1: 1, 3: 1})
Duplicated values: [2, 4, 5]Para obter uma lista deduplicada a partir de um Counter, use list(counts.keys()) — as chaves preservam a ordem de inserção no Python 3.7+.
Removendo Duplicatas de um DataFrame com Pandas
Se você estiver trabalhando com dados tabulares, a biblioteca Pandas oferece DataFrame.drop_duplicates(). Ela suporta controle refinado por meio de seus parâmetros.
import pandas as pd
data = {
'name': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob'],
'score': [90, 85, 90, 78, 85],
}
df = pd.DataFrame(data)
df_unique = df.drop_duplicates()
print(df_unique)Saída:
name score
0 Alice 90
1 Bob 85
3 Charlie 78Parâmetros principais:
subset— nome de uma coluna ou lista de nomes de colunas a considerar. Duplicatas são detectadas apenas dentro dessas colunas.keep—'first'(padrão) mantém a primeira ocorrência;'last'mantém a última;Falseremove todas as linhas que têm duplicatas.inplace=True— modifica o DataFrame no lugar em vez de retornar um novo.
# Keep only the last occurrence of each name
df_last = df.drop_duplicates(subset='name', keep='last')
print(df_last)Saída:
name score
2 Alice 90
3 Charlie 78
4 Bob 85Escolhendo o Método Certo
- Mais rápido, a ordem não importa —
set(). - A ordem importa, em uma linha —
dict.fromkeys(). - Lógica personalizada ou registro — loop explícito com um seen set.
- Dados tabulares —
pandas.DataFrame.drop_duplicates(). - Precisa inspecionar quais valores são duplicados —
collections.Counter.
Para saber mais sobre como trabalhar com listas, consulte o capítulo Python Lists e a referência completa de métodos de lista. Para aprender sobre sets e suas operações, consulte Python Sets e Set Methods.