Cómo deduplicar una lista en Python

Aliaksei Yursha 30 enero 2023
  1. Deduplicar una lista en Python sin preservar el orden
  2. Deduplicar una lista en Python con preservación del orden
Cómo deduplicar una lista en Python

A veces en Python, tenemos una lista de valores, entre los cuales algunos son duplicados.
Es un caso de uso diario para eliminar todos los duplicados de la lista, de modo que
todos los valores restantes de la lista son únicos.

Podemos lograrlo usando diferentes métodos, algunos de los cuales preservan el
orden original de los elementos, mientras que otros no.

Deduplicar una lista en Python sin preservar el orden

Si no es un requisito para preservar el pedido original,
podemos deduplicar una lista usando la estructura de datos set incorporada.
El set es una estructura de datos que sólo puede contener elementos únicos por diseño.

Construyendo tal set desde nuestra lista inicial, todos los elementos duplicados
son ignorados.
Entonces podemos convertir el conjunto de nuevo en una lista y obtendremos una lista de elementos únicos.

Desafortunadamente, el orden de los elementos cambia, ya que al deduplicar
La funcionalidad de la estructura de datos set se implementa utilizando tablas hash, que
no recadenan qué elementos se insertaron primero.

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

Si utilizas el paquete NumPy para computación científica en Python,
también puede emplear la función numpy.unique().

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

Tenga en cuenta que el método anterior tampoco conserva el orden original de los elementos.
El método NumPy que preserva el orden es más complicado, y lo puedes encontrar más abajo.

Deduplicar una lista en Python con preservación del orden

Una solución sencilla, que permite conservar el pedido inicial, es utilizar un doble bucle para cada uno.

El primer bucle atraviesa todos los elementos de la lista original.
El segundo bucle comprueba si ya hemos visto un elemento con el mismo valor.

Si no lo hemos hecho, lo añadimos a la lista unique, que al final,
contendrá elementos únicos en el orden 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']

Otra forma de deduplicar una lista conservando el orden original es utilizar
la estructura de datos collections.OrderedDict.
OrderedDict es un tipo especial de estructura de datos de diccionario en Python, que
recadena el orden de inserción de las llaves.

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

Si utiliza la biblioteca de análisis de datos en Python Pandas,
Pandas.unique también puede ser útil. Este método preserva el orden.

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

La forma de NumPy de deduplicar una lista mientras se preserva el orden es un poco más complicada.
Tienes que recordar un índice de cada elemento distintivo y luego recrear una lista única
del original usando tales í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']

Artículo relacionado - Python List