Eliminar duplicados en Python: Guía completa
Aprende cinco formas de eliminar duplicados de una lista en Python: conversión a set, dict.fromkeys, bucle for con seen set, comprensión de listas y Counter.
Los valores duplicados en una lista de Python son frecuentes al recopilar entradas de usuario, combinar conjuntos de datos o leer archivos. Esta guía cubre cinco técnicas prácticas para eliminar duplicados — cada una con un equilibrio diferente entre velocidad, preservación del orden y legibilidad.
| Método | Preserva el orden | Funciona con elementos no hasheables | Legible |
|---|---|---|---|
set() | No | No | Sí |
dict.fromkeys() | Sí (Python 3.7+) | No | Sí |
| Bucle for con seen set | Sí | No | Medio |
| Comprensión de listas | Sí | No | Medio |
Counter (encontrar dups) | Sí | No | Sí |
Usar set() para eliminar duplicados
Convertir una lista en un set es la forma más rápida y concisa de eliminar duplicados. Un set almacena solo valores únicos y hasheables, por lo que cualquier duplicado se descarta automáticamente.
Salida (el orden puede variar):
[1, 2, 3, 4, 5]Cuándo usarlo: cuando el orden no importa y la lista contiene solo elementos hasheables (números, strings, tuplas).
Advertencia: los sets no tienen orden. Aunque los sets de enteros pequeños suelen imprimirse en orden ascendente, no se puede depender de ello. Si el orden importa, usa uno de los métodos a continuación.
Usar dict.fromkeys() para preservar el orden
dict.fromkeys() crea un diccionario cuyos keys son los elementos de la lista. Dado que los keys de un diccionario son únicos y, desde Python 3.7, mantienen el orden de inserción, esto elimina duplicados conservando el orden original.
Salida:
[1, 2, 3, 4, 5]Esta es la forma idiomática de deduplicar en una sola línea preservando el orden en Python moderno (3.7+). Además, es ligeramente más rápida que un bucle explícito porque las operaciones del diccionario se ejecutan en C.
Usar un bucle for con un seen set
Cuando necesitas control total — por ejemplo, para registrar los duplicados omitidos o aplicar lógica de igualdad personalizada — un bucle explícito es el enfoque más claro.
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))Salida:
[3, 1, 4, 5, 9, 2, 6]Esto preserva el orden de inserción y se ejecuta en tiempo O(n) — la comprobación in sobre un set es O(1). Compara esto con if item not in result, que es O(n) por elemento y hace que toda la función sea O(n²).
Usar comprensión de listas
Puedes escribir el mismo patrón con seen set en una sola línea usando una comprensión de listas. El truco es que set.add() siempre devuelve None (falsy), por lo que not (x in seen or seen.add(x)) es True solo la primera vez que aparece cada valor.
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)Salida:
[3, 1, 4, 5, 9, 2, 6]Esto es compacto pero depende de un efecto secundario dentro de la comprensión, lo cual puede sorprender a quienes lean el código. El bucle for explícito anterior suele preferirse en código de equipo.
Usar Counter para encontrar qué valores están duplicados
A veces necesitas saber qué valores aparecen más de una vez en lugar de simplemente eliminarlos. collections.Counter cuenta las ocurrencias y facilita esta tarea.
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)Salida:
Counter({5: 3, 2: 2, 4: 2, 1: 1, 3: 1})
Duplicated values: [2, 4, 5]Para obtener una lista deduplicada desde un Counter, usa list(counts.keys()) — los keys preservan el orden de inserción en Python 3.7+.
Eliminar duplicados de un DataFrame con Pandas
Si trabajas con datos tabulares, la biblioteca Pandas proporciona DataFrame.drop_duplicates(). Ofrece un control detallado a través de sus 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)Salida:
name score
0 Alice 90
1 Bob 85
3 Charlie 78Parámetros clave:
subset— nombre de columna o lista de nombres de columnas a considerar. Los duplicados se detectan solo dentro de esas columnas.keep—'first'(por defecto) conserva la primera ocurrencia;'last'conserva la última;Falseelimina todas las filas que tienen duplicados.inplace=True— modifica el DataFrame en su lugar en vez de devolver uno nuevo.
# Keep only the last occurrence of each name
df_last = df.drop_duplicates(subset='name', keep='last')
print(df_last)Salida:
name score
2 Alice 90
3 Charlie 78
4 Bob 85Elegir el método adecuado
- Más rápido, el orden no importa —
set(). - El orden importa, en una línea —
dict.fromkeys(). - Lógica personalizada o registro de eventos — bucle for explícito con un seen set.
- Datos tabulares —
pandas.DataFrame.drop_duplicates(). - Necesitas inspeccionar qué valores están duplicados —
collections.Counter.
Para más información sobre el trabajo con listas, consulta el capítulo Python Lists y la referencia completa de métodos de lista. Para aprender sobre sets y sus operaciones, consulta Python Sets y Set Methods.