Eliminar duplicados en listas de Python manteniendo el orden

目次

1. Necesidad de eliminar duplicados en listas en Python

Realizar la eliminación de duplicados en listas en Python es muy importante en muchas situaciones. En particular, al manejar grandes cantidades de datos, es una operación indispensable para asegurar la unicidad de los datos y realizar un procesamiento eficiente.

Razones para eliminar duplicados en listas

  1. Mejora de la precisión en el análisis de datos
    En el análisis de datos, la presencia de datos duplicados puede impedir obtener resultados precisos. Por ejemplo, al agregar datos de ventas o resultados de encuestas, la existencia de duplicados puede conducir a conclusiones erróneas.
  2. Integración con bases de datos
    Al importar datos a una base de datos con Python, si las claves únicas están duplicadas se produce un error. Eliminar los duplicados con Python de antemano permite un procesamiento de datos fluido.
  3. Mejora de la eficiencia del procesamiento
    Si el tamaño de los datos es innecesariamente grande, aumenta la carga en la memoria y el tiempo de procesamiento. En particular, con datos a gran escala, eliminar duplicados puede mejorar el rendimiento del sistema en su totalidad.

Escenarios típicos para realizar la eliminación de duplicados

  • Limpieza de datos: cuando se organizan datos obtenidos mediante web scraping.
  • Detección de duplicados: al encontrar duplicados en listas de inventario de productos o información de registro de usuarios.
  • Manipulación de arreglos: cuando se desea eliminar datos duplicados en operaciones específicas de listas.

Objetivo de este artículo

En este artículo se explican desde los métodos básicos hasta ejemplos avanzados para eliminar duplicados en listas usando Python. Se presentan una variedad de técnicas, desde enfoques simples para principiantes hasta métodos que conservan el orden y consideran el rendimiento. De este modo, los lectores podrán elegir la solución óptima para sus necesidades.

2. Cómo eliminar duplicados de una lista usando set

La forma más básica de eliminar duplicados de una lista en Python es usar set. set es un tipo de datos incorporado de Python que tiene la característica de no permitir duplicados. Aprovechando esta característica, es posible eliminar fácilmente los duplicados de una lista.

Ejemplo de código básico

El siguiente código muestra cómo eliminar elementos duplicados de una lista y crear una lista que solo contenga elementos únicos.

# Lista original
my_list = [1, 2, 2, 3, 4, 4, 5]

# Eliminar duplicados usando set
unique_list = list(set(my_list))

print(unique_list)  # Resultado: [1, 2, 3, 4, 5]

Explicación del resultado y funcionamiento

  • Entrada:[1, 2, 2, 3, 4, 4, 5]
  • Salida:[1, 2, 3, 4, 5] (Los elementos duplicados 2 y 4 fueron eliminados)

En este código, al convertir la lista al tipo set, los duplicados se eliminan automáticamente. Después, usando la función list(), se convierte set de nuevo a una lista.

Ventajas de usar set

  1. Simple e intuitivo
    Como se puede implementar con código corto, es un método fácil de entender incluso para principiantes.
  2. Velocidad de procesamiento alta
    Gracias a las características de set, el procesamiento de eliminación de duplicados se realiza de manera eficiente.

Precauciones al usar set

El orden original de la lista no se conservaPor favor, mire el siguiente ejemplo.

# Lista original
my_list = [4, 3, 4, 2, 1]

# Eliminar duplicados usando set
unique_list = list(set(my_list))

print(unique_list)  # Resultado: [1, 2, 3, 4]

Como se ve en este resultado, al usar set, el orden de los elementos en la lista cambia de manera aleatoria. Por lo tanto, en situaciones donde el orden es importante, es necesario considerar otros métodos.

Cuándo usar set

  • Cuando el orden no es importante.
  • Cuando se necesita un procesamiento simple y rápido.

En la siguiente sección, explicaremos en detalle cómo eliminar duplicados manteniendo el orden.

侍エンジニア塾

3. Cómo eliminar duplicados manteniendo el orden

Si deseas eliminar duplicados de una lista en Python manteniendo el orden, set no es suficiente. Por lo tanto, presentamos otro método para eliminar duplicados manteniendo el orden. En esta sección se explican los métodos que utilizan dict.fromkeys() y OrderedDict.

Método usando dict.fromkeys()

A partir de Python 3.6, dict (tipo diccionario) conserva el orden de inserción. Aprovechando esta característica, se pueden eliminar duplicados manteniendo el orden.

Ejemplo de código

# Lista original
my_list = [4, 3, 4, 2, 1]

# Usar dict.fromkeys() para eliminar duplicados
unique_list = list(dict.fromkeys(my_list))

print(unique_list)  # Resultado: [4, 3, 2, 1]

Resultado de ejecución y explicación del comportamiento

  • Entrada:[4, 3, 4, 2, 1]
  • Salida:[4, 3, 2, 1]
    En este código, se usa dict.fromkeys() para almacenar los elementos de la lista como claves del diccionario. Las claves del diccionario no permiten duplicados, por lo que los duplicados se eliminan automáticamente. Luego, al convertir las claves del diccionario a una lista, se obtiene el resultado manteniendo el orden.

Ventajas

  1. Se mantiene el orden
    Se pueden eliminar duplicados conservando el orden de la lista original.
  2. Código conciso
    dict.fromkeys() solo usando se logra tanto mantener el orden como eliminar duplicados.

Desventajas

  • Si no se comprende el comportamiento interno del diccionario, puede resultar un poco difícil para principiantes.

Método usando OrderedDict

Otra forma es usar collections módulo que contiene OrderedDict. Este método también elimina duplicados manteniendo el orden de la lista.

Ejemplo de código

from collections import OrderedDict

# Lista original
my_list = [4, 3, 4, 2, 1]

# Utilizar OrderedDict para eliminar duplicados
unique_list = list(OrderedDict.fromkeys(my_list))

print(unique_list)  # Resultado: [4, 3, 2, 1]

Resultado de ejecución y explicación del comportamiento

OrderedDict, al igual que los diccionarios, no permite claves duplicadas y conserva el orden de inserción. dict.fromkeys() es similar, pero funciona de manera estable sin depender de la versión de Python.

Ventajas

  1. Alta compatibilidad
    Permite mantener el orden incluso en versiones anteriores a Python 3.6.
  2. Alta fiabilidad
    OrderedDict está diseñado específicamente para soportar el mantenimiento del orden, por lo que es un método más seguro.

Desventajas

  • Se requiere importar la biblioteca estándar.
  • dict.fromkeys() es ligeramente más complejo comparado con dict.fromkeys().

Comparación de rendimiento

A continuación se comparan los rendimientos al usar dict.fromkeys() y OrderedDict.

Ejemplo de código

import time
from collections import OrderedDict

# Datos masivos
large_list = [i for i in range(100000)] + [i for i in range(100000)]

# Rendimiento de dict.fromkeys()
start = time.time()
unique_list1 = list(dict.fromkeys(large_list))
print(f"Tiempo de procesamiento de dict.fromkeys(): {time.time() - start:.6f} segundos")

# Rendimiento de OrderedDict
start = time.time()
unique_list2 = list(OrderedDict.fromkeys(large_list))
print(f"Tiempo de procesamiento de OrderedDict: {time.time() - start:.6f} segundos")

Resultado (ejemplo)

Tiempo de procesamiento de dict.fromkeys(): 0.014561 segundos
Tiempo de procesamiento de OrderedDict: 0.018437 segundos
  • dict.fromkeys() es ligeramente más rápido.
  • OrderedDict es útil cuando se necesita compatibilidad o se prioriza la fiabilidad.

Situaciones en las que debe usarse este método

  1. Casos donde el orden es importante.
  2. Cuando se desea mantener el orden y eliminar duplicados simultáneamente.
  3. Al considerar la versión de Python y la compatibilidad futura.

4. Métodos avanzados para eliminar duplicados en listas

Los casos más complejos que no pueden resolverse con la eliminación de duplicados básica también pueden manejarse con Python. En esta sección se explica la eliminación de duplicados en listas bidimensionales y la eliminación condicional de duplicados.

Cómo eliminar duplicados en listas bidimensionales

En una lista bidimensional (estructura que contiene listas dentro de una lista) no se pueden usar directamente set ni dict.fromkeys(). Esto se debe a que las listas son mutables, por lo que no pueden ser claves de set ni de un diccionario.

Método: usar tuplas

Al convertir temporalmente la lista en una tupla, es posible usar set para eliminar duplicados incluso en listas bidimensionales.

Ejemplo de código

# Lista bidimensional original
nested_list = [[1, 2], [3, 4], [1, 2]]

# Eliminación de duplicados
unique_list = [list(x) for x in set(tuple(x) for x in nested_list)]

print(unique_list)  # Resultado: [[1, 2], [3, 4]]

Resultado de la ejecución y explicación del funcionamiento

  • Entrada: [[1, 2], [3, 4], [1, 2]]
  • Salida: [[1, 2], [3, 4]]

Este código convierte temporalmente cada lista interna en una tupla, la almacena en set y elimina los duplicados. Luego, el resultado se vuelve a convertir en lista.

Ventajas

  • Permite eliminar duplicados en listas bidimensionales de forma concisa.
  • Al volver a la estructura original (lista), se puede usar de manera flexible.

Desventajas

  • Puede ser difícil de aplicar cuando las listas internas están anidadas y la estructura se vuelve más compleja.

Cómo eliminar duplicados con condiciones específicas

Es posible eliminar duplicados solo cuando se cumplen condiciones específicas basadas en los elementos de la lista. Por ejemplo, consideremos el caso de eliminar duplicados en una lista de diccionarios cuando el valor de una clave específica es el mismo.

Ejemplo de código

A continuación se muestra un ejemplo que elimina duplicados para que los diccionarios en la lista sean únicos según el valor de la clave "id".

# Lista original (lista de diccionarios)
data_list = [
    {"id": 1, "name": "Alice"},
    {"id": 2, "name": "Bob"},
    {"id": 1, "name": "Alice"},
    {"id": 3, "name": "Charlie"}
]

# Eliminar duplicados basado en la clave id
unique_list = list({item["id"]: item for item in data_list}.values())

print(unique_list)
# Resultado: [{'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'}, {'id': 3, 'name': 'Charlie'}]

Resultado de la ejecución y explicación del funcionamiento

  • Entrada: [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}, {"id": 1, "name": "Alice"}, {"id": 3, "name": "Charlie"}]
  • Salida: [{'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'}, {'id': 3, 'name': 'Charlie'}]

Este código convierte temporalmente la lista de diccionarios en una clave, elimina los duplicados y luego vuelve a la lista original usando el método values().

Ventajas

  • Permite eliminar duplicados de forma flexible según cualquier condición.
  • Se puede aplicar a diccionarios y estructuras de datos complejas.

Desventajas

  • El código puede resultar algo complejo, lo que lo hace difícil para principiantes.

Caso de uso: eliminación de duplicados en análisis de datos

Este método es especialmente útil en análisis de datos y limpieza de datos. Por ejemplo, se puede aplicar en los siguientes escenarios:

  • Eliminar datos duplicados con el mismo ID de usuario.
  • Organizar duplicados que aparecen al combinar múltiples fuentes de datos.
  • Crear un conjunto de datos único basado en los valores de una columna específica.

Situaciones en las que se deben usar métodos avanzados

  1. Eliminación de duplicados en listas bidimensionales o listas de diccionarios.
  2. Cuando es necesario eliminar duplicados bajo condiciones específicas.
  3. Al organizar datos como preprocesamiento para limpieza o análisis.
年収訴求

5. Comparación de rendimiento

Al eliminar duplicados de listas en Python, el rendimiento (velocidad de procesamiento y uso de memoria) varía según el método utilizado. En esta sección se comparan los rendimientos de los métodos representativos y se analizan sus casos de aplicación.

Objetivos de comparación y criterios de evaluación

Métodos comparados

  1. set método que usa
  2. dict.fromkeys() método que usa
  3. OrderedDict método que usa

Criterios de evaluación

  • Velocidad de procesamiento (tiempo de ejecución según el tamaño de los datos)
  • Uso de memoria (eficiencia al procesar grandes volúmenes de datos)

Prueba de benchmark con código real

Se mide la velocidad de procesamiento de cada método usando el siguiente código.

Ejemplo de código de benchmark

import time
from collections import OrderedDict

# Creación de un conjunto de datos grande
large_list = [i for i in range(100000)] + [i for i in range(50000)]

# En caso de usar set
start_time = time.time()
unique_set = list(set(large_list))
print(f"Tiempo de procesamiento de set: {time.time() - start_time:.6f} segundos")

# En caso de usar dict.fromkeys()
start_time = time.time()
unique_dict = list(dict.fromkeys(large_list))
print(f"Tiempo de procesamiento de dict.fromkeys(): {time.time() - start_time:.6f} segundos")

# En caso de usar OrderedDict
start_time = time.time()
unique_ordered_dict = list(OrderedDict.fromkeys(large_list))
print(f"Tiempo de procesamiento de OrderedDict: {time.time() - start_time:.6f} segundos")

Ejemplo de resultados de benchmark

A continuación se muestra un ejemplo de tiempos de procesamiento usando un conjunto de datos a gran escala (más de 150,000 elementos):

set tiempo de procesamiento: 0.012345 segundos
dict.fromkeys() tiempo de procesamiento: 0.016789 segundos
OrderedDict tiempo de procesamiento: 0.018234 segundos

Análisis de resultados

  1. set
    El más rápido y eficiente. Es adecuado cuando no es necesario mantener el orden.
  2. dict.fromkeys()
    Un poco más lento que set, pero muy útil cuando se necesita mantener el orden.
  3. OrderedDict
    La velocidad de procesamiento es casi la misma que dict.fromkeys(), pero se usa en casos que requieren compatibilidad con versiones anteriores a Python 3.6.

Comparación del uso de memoria

A continuación se muestra una comparación sencilla de la eficiencia de memoria de cada método.

MétodoEficiencia de memoriaCaracterísticas
set usoAltaIdeal cuando el tamaño de los datos es muy grande.
dict.fromkeys() usoMediaBuen equilibrio entre mantener el orden y la eficiencia.
OrderedDict usoAlgo bajaSe aplica en casos donde se prioriza la compatibilidad.

Puntos clave para elegir el método adecuado

Casos en los que se debe elegir set

  • Cuando el orden de los datos no es importante.
  • Cuando se prioriza la velocidad de procesamiento.
  • Al trabajar con datos a gran escala.

Casos en los que se debe elegir dict.fromkeys()

  • Cuando se desea eliminar duplicados manteniendo el orden de los datos.
  • Cuando se prefiere un código sencillo.

Casos en los que se debe elegir OrderedDict

  • Cuando es necesario mantener el orden pero se requiere compatibilidad con versiones anteriores a Python 3.6.
  • Al trabajar con código antiguo o sistemas legados.

Opciones prácticas

Según el escenario real, se pueden elegir de la siguiente manera:

  1. En la limpieza de datos, priorizar la velocidad: set
  2. En análisis de datos, mantener el orden es importante: dict.fromkeys()
  3. En proyectos de operación a largo plazo que requieren compatibilidad: OrderedDict

6. Preguntas frecuentes (FAQ)

En esta sección, se responden las dudas que los lectores suelen tener al eliminar duplicados de listas en Python. Cada pregunta se explica basándose en programas reales y ejemplos prácticos.

1. ¿Por qué al usar set no se conserva el orden?

set es una estructura de datos que no conserva el orden.
set es uno de los tipos de datos incorporados de Python; no permite duplicados y, a cambio, no almacena información de orden. Por lo tanto, si es necesario conservar el orden de la lista original, se debe usar dict.fromkeys() o OrderedDict, entre otros.

Solución

# Usar dict.fromkeys() para mantener el orden
my_list = [4, 3, 4, 2, 1]
unique_list = list(dict.fromkeys(my_list))
print(unique_list)  # Resultado: [4, 3, 2, 1]

2. ¿Se puede eliminar duplicados de una lista bidimensional conservando el orden?

Sí, es posible. Sin embargo, en una lista bidimensional los elementos son listas dentro de listas, por lo que no se puede usar directamente set. En su lugar, se puede emplear temporalmente tuplas para lograrlo.

Solución

A continuación se muestra un ejemplo de cómo eliminar duplicados de una lista bidimensional manteniendo el orden.

# Lista bidimensional original
nested_list = [[1, 2], [3, 4], [1, 2], [5, 6]]

# Eliminar duplicados manteniendo el orden
unique_list = []
[unique_list.append(x) for x in nested_list if x not in unique_list]

print(unique_list) # Resultado: [[1, 2], [3, 4], [5, 6]]

3. ¿Cómo eliminar duplicados de manera eficiente con grandes volúmenes de datos?

Cuando se manejan conjuntos de datos a gran escala, usar set es lo más eficiente. set utiliza internamente una tabla hash, lo que permite buscar y almacenar elementos rápidamente.

Solución

# Conjunto de datos masivo
large_list = [i for i in range(100000)] + [i for i in range(50000)]

# Eliminar duplicados usando set
unique_list = list(set(large_list))
print(len(unique_list))  # Resultado: 100000 (número de elementos únicos)

Consideraciones

  • Al no conservar el orden, si el orden es importante, considere otro método.
  • Si el consumo de memoria es muy alto, es necesario considerar la eficiencia de memoria.

4. ¿Es posible eliminar duplicados basándose en una parte de la lista?

Sí, es posible. Si la lista está compuesta por elementos tipo diccionario, se pueden extraer valores únicos basándose en una clave específica.

Solución

# Lista de diccionarios
data_list = [
    {"id": 1, "name": "Alice"},
    {"id": 2, "name": "Bob"},
    {"id": 1, "name": "Alice"},
    {"id": 3, "name": "Charlie"}
]

# Eliminación de duplicados basada en la clave id
unique_list = list({item["id"]: item for item in data_list}.values())

print(unique_list)
# Resultado: [{'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'}, {'id': 3, 'name': 'Charlie'}]

5. ¿Es necesario prestar atención a la compatibilidad según la versión de Python?

A partir de Python 3.6, dict conserva el orden. Por lo tanto, al usar dict.fromkeys() es necesario prestar atención a la versión de Python. En entornos anteriores a Python 3.5, si se desea mantener el orden, es necesario usar OrderedDict.

Solución (para Python ≤3.5)

from collections import OrderedDict

# Utilizar OrderedDict para mantener el orden
my_list = [4, 3, 4, 2, 1]
unique_list = list(OrderedDict.fromkeys(my_list))
print(unique_list)  # Resultado: [4, 3, 2, 1]

6. ¿Cuáles son las causas cuando la eliminación de duplicados no funciona correctamente?

Si la eliminación de duplicados no funciona correctamente, verifique los siguientes puntos:

  1. Los elementos de la lista son de tipos de datos mutables
    Los listas y diccionarios no pueden ser claves de set, lo que genera un error. Conviértalos a tuplas según sea necesario.
  2. Compatibilidad con la versión de Python
    Verifique que el método que está usando sea compatible con la versión de Python.
  3. Falta de especificación de condiciones
    Al eliminar duplicados bajo condiciones específicas, es posible que las condiciones no estén correctamente especificadas.

Resumen de FAQ

  • Cuando se desea conservar el orden: use dict.fromkeys() o OrderedDict.
  • Cuando se quiere procesar grandes volúmenes de datos de manera eficiente: use set.
  • Eliminación de duplicados con condiciones: aproveche los tipos dict y las comprensiones de listas.

Al comprender estos métodos y elegir el adecuado, podrá resolver los problemas relacionados con la manipulación de listas.

7. Resumen

Existen diversas opciones para eliminar duplicados en listas con Python, desde métodos simples hasta enfoques avanzados. Cada método tiene ventajas y desventajas, y es importante elegir la técnica adecuada según las necesidades y el escenario específico.

Métodos básicos

Método usando set es el método más simple y rápido. Presenta las siguientes características:

  • Ventajas: código corto y alta velocidad de procesamiento.
  • Desventajas: no conserva el orden.
  • Casos de uso: ideal cuando el orden no es importante o al procesar grandes volúmenes de datos de manera eficiente.
my_list = [1, 2, 2, 3, 4, 4]
unique_list = list(set(my_list))
print(unique_list)  # Resultado: [1, 2, 3, 4]

Métodos que conservan el orden

dict.fromkeys() y OrderedDict permiten eliminar duplicados conservando el orden. Estos métodos son adecuados cuando el orden de los datos es importante.

  • dict.fromkeys() (Python 3.6 o superior)
my_list = [4, 3, 4, 2, 1]
unique_list = list(dict.fromkeys(my_list))
print(unique_list)  # Resultado: [4, 3, 2, 1]
  • OrderedDict (compatible también con entornos Python 3.5 o anteriores)
from collections import OrderedDict
my_list = [4, 3, 4, 2, 1]
unique_list = list(OrderedDict.fromkeys(my_list))
print(unique_list)  # Resultado: [4, 3, 2, 1]

Métodos avanzados

Eliminación de duplicados en listas bidimensionales y con condiciones y otros casos más complejos.

  • En listas bidimensionales, se puede convertir temporalmente a tuplas y usar set.
  • En listas de diccionarios, es posible eliminar duplicados basándose en una clave específica.
# Lista bidimensional
nested_list = [[1, 2], [3, 4], [1, 2]]
unique_list = [list(x) for x in set(tuple(x) for x in nested_list)]
print(unique_list)  # Resultado: [[1, 2], [3, 4]]

# Eliminación de duplicados condicional
data_list = [
    {"id": 1, "name": "Alice"},
    {"id": 2, "name": "Bob"},
    {"id": 1, "name": "Alice"}
]
unique_list = list({item["id"]: item for item in data_list}.values())
print(unique_list)  # Resultado: [{'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'}]

Comparación de rendimiento

La velocidad de procesamiento y el uso de memoria de cada método varían según el tamaño de los datos y los requisitos. A continuación se resume.

MétodoVelocidadConserva ordenCasos de uso
Uso de setAlta velocidad×Datos a gran escala, cuando el orden no es importante
Uso de dict.fromkeys()Velocidad mediaCuando el orden es importante
Uso de OrderedDictVelocidad mediaConserva orden en versiones antiguas de Python

Cómo elegir el método

  • Se necesita procesamiento simple y rápido: usar set.
  • Se desea conservar el orden: usar dict.fromkeys() o OrderedDict.
  • Casos avanzados (estructuras de datos complejas o eliminación condicional): usar conversión a tupla o comprensiones de listas.

Mensaje para los lectores

Al aplicar los métodos presentados en este artículo, podrá eliminar duplicados en listas con Python de manera eficiente. Elija la técnica adecuada según las características y objetivos de sus datos, y utilícela en proyectos y análisis reales.
Esperamos que el contenido de este artículo sea de ayuda para quienes aprenden Python o necesitan manipular listas. Si tiene preguntas o casos más detallados, ¡esperamos sus comentarios y opiniones!

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール