W3docs

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étodoPreserva a ordemFunciona com itens não hasháveisLegível
set()NãoNãoSim
dict.fromkeys()Sim (Python 3.7+)NãoSim
Loop com seen setSimNãoMédio
List comprehensionSimNãoMédio
Counter (encontra dups)SimNãoSim

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.

python— editable, runs on the server

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.

python— editable, runs on the server

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     78

Parâ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; False remove 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     85

Escolhendo o Método Certo

  • Mais rápido, a ordem não importaset().
  • A ordem importa, em uma linhadict.fromkeys().
  • Lógica personalizada ou registro — loop explícito com um seen set.
  • Dados tabularespandas.DataFrame.drop_duplicates().
  • Precisa inspecionar quais valores são duplicadoscollections.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.

Was this page helpful?