HOWTO · Python

Cómo obtener valores únicos de una lista en Python

El artículo introduce métodos para obtener valores únicos de una lista en Python

En esta página

Para obtener valores únicos de una lista de Python en Python 3.7 o versiones posteriores, usa list(dict.fromkeys(values)) si los elementos son hashables y quieres conservar el orden de su primera aparición. Si no son hashables, usa un bucle que construya una lista de resultados. Convierte a set(values) solo si el orden no importa.

Obtener valores únicos en orden con dict.fromkeys()

dict.fromkeys() crea un diccionario cuyas claves proceden del iterable de entrada. Las claves de un diccionario son únicas y, desde Python 3.7, se garantiza que los diccionarios conservan el orden de inserción. Por eso, al convertir las claves de nuevo en una lista, se eliminan los duplicados y se mantiene la posición de la primera aparición de cada valor. Este método requiere que todos los elementos sean hashables, como ocurre generalmente con las claves de diccionario.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

values = ["pear", "apple", "pear", "plum", "apple"]
unique_values = list(dict.fromkeys(values))
print(unique_values)

Salida:

['pear', 'apple', 'plum']

Obtener valores únicos en orden con un bucle

Cuando los valores no son hashables, como ocurre con las listas anidadas, un diccionario o un conjunto no puede usarlos como claves o elementos. En su lugar, un bucle explícito puede comparar cada valor con los que ya se recopilaron. Conserva la primera aparición y funciona con listas de valores cuyas comparaciones de igualdad tienen sentido.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

values = [[1, 2], [3, 4], [1, 2]]
unique_values = []
for value in values:
    if value not in unique_values:
        unique_values.append(value)
print(unique_values)

Cada comprobación value not in unique_values recorre la lista de resultados. A medida que aumenta la cantidad de elementos distintos, las comparaciones repetidas pueden hacer que este método sea más lento que los métodos basados en hash. Úsalo cuando sea más importante admitir elementos no hashables que la velocidad.

Obtener valores únicos con set() cuando el orden no importa

Para elementos hashables, set(values) elimina duplicados de forma concisa. Un conjunto no conserva el orden de la lista de entrada, así que no dependas de una secuencia concreta al convertirlo de nuevo en una lista. Los elementos del conjunto también deben ser hashables. Elige esta opción cuando el orden sea irrelevante, por ejemplo, para comprobar la pertenencia o comparar qué valores están presentes.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

values = ["pear", "apple", "pear", "plum", "apple"]
unique_values = set(values)
print(unique_values)

El orden mostrado para el conjunto puede variar: el resultado contiene los valores distintos, pero no se garantiza ningún orden concreto al imprimirlo.

Elegir un método para tu lista

Elige dict.fromkeys() para obtener una lista de resultados concisa que conserve la primera aparición de cada valor hashable. Elige el bucle explícito si puede haber valores no hashables, como listas, y aun así importa conservar el orden de la primera aparición. Elige set() cuando los valores sean hashables y el orden no tenga importancia.

Con entradas hashables, la pertenencia a diccionarios y conjuntos suele ser eficiente en promedio, mientras que el bucle vuelve a buscar en una lista de resultados que crece continuamente. Estos métodos determinan los duplicados según el comportamiento de igualdad y hash de Python: valores iguales, como 1 y True, se consideran iguales y se reducen a una sola entrada. Si tu aplicación necesita otra definición de unicidad, normaliza o calcula primero una clave para cada elemento y luego elimina duplicados según esa clave.