Nivel: Intermedio
Tema: Listas, sets, orden estable, validación de entradas, complejidad, tests con pytest
Objetivo: Eliminar elementos duplicados de una lista manteniendo el orden original de aparición, un patrón común en limpieza de datos.
Enunciado
Crea una función llamada eliminar_duplicados(lista) que:
- Reciba un valor
lista. - Si
listaesNone, devuelva una lista vacía[]. - Si
listano es una lista (list), lanceTypeError. - Devuelva una nueva lista sin duplicados.
- Mantenga el orden original.
- Solo debe funcionar con elementos “hashables” (por ejemplo:
int,str,tuple).- Si aparece un elemento no hashable (por ejemplo, un
dictolist), la función debe lanzarTypeError.
- Si aparece un elemento no hashable (por ejemplo, un
Ejemplos
eliminar_duplicados([1, 2, 2, 3, 1])→[1, 2, 3]eliminar_duplicados(["a", "a", "b", "a"])→["a", "b"]eliminar_duplicados([])→[]eliminar_duplicados(None)→[]eliminar_duplicados([1, {"a": 1}])→ TypeError
Pistas
- Usa un
setpara recordar qué elementos ya viste. - Recorre la lista y añade al resultado solo si no lo has visto.
- Para detectar si algo es hashable, puedes intentar hacer
hash(valor)dentro de untry/except.
Solución explicada (paso a paso)
- Si
listaesNone, devolvemos[]. - Validamos que
listasea una lista. - Creamos:
vistos(unset) para registrar elementos únicos,resultado(una lista) para la salida.
- Recorremos cada elemento:
- verificamos que sea hashable (si no,
TypeError), - si no está en
vistos, lo añadimos aresultadoy lo registramos.
- verificamos que sea hashable (si no,
- Devolvemos
resultado.
Ejecuta:
pytest -q
Variantes para subir de nivel (opcional)
- Permitir elementos no hashables convirtiéndolos a una representación (por ejemplo,
json.dumps) (avanzado) - Eliminar duplicados por clave en una lista de diccionarios (patrón real)
- Devolver también los duplicados encontrados
- Comparar rendimiento vs.
dict.fromkeys(lista)(con restricciones)
Lo que aprendiste
- Cómo eliminar duplicados sin perder orden
- Uso de
setpara búsquedas O(1) - Qué significa que un objeto sea hashable
- Validación defensiva en funciones intermedias
Accede al código completo y a los tests en GitHub para ejecutar y modificar la solución localmente.
Continúa con Reto #15 — Leer un CSV y calcular métricas (sin pandas) para practicar procesamiento de archivos y datos tabulares, muy útil en tareas reales.