Python – Eliminación de múltiples elementos repetidos de una lista

Objetivo: presentar algunas técnicas en Python para la eliminación de elementos que aparecen repetidos en una lista.

La necesidad de eliminar elementos en una lista es algo común en cualquier proyecto de programación. Repasaremos, en primer lugar, la eliminación de un elemento simple empleando los recursos propios del objeto list para luego explicar cómo proceder en el caso de que queramos suprimir elementos repetidos.

Partamos del siguiente problema simple: dada una lista queremos eliminar cierto elemento dado. Por ejemplo, supongamos que nos ofrecen un gazpacho preparado del siguiente modo:

>>> gazpacho = ['aceite', 'vinagre', 'leche', 'tomate', 'pan', 'pepino', 'pimiento']

Sobre gustos no hay nada escrito, pero yo, desde luego, me cuidaría de probar semejante combinación. Dudo mucho que la leche haga buenas migas con los restantes ingredientes.

Aprovechemos nuestros conocimientos sobre Python para devolver esa pócima imbebible a su estado natural. Como ya sabemos por artículos anteriores, suprimir la leche es tan simple como esto:

>>> gazpacho.remove('leche')
>>> gazpacho
['aceite', 'vinagre', 'tomate', 'pan', 'pepino', 'pimiento']

Y ahora sí que me tomaría siete vasos seguidos.

El método remove modifica la lista in-situ, atacando al objeto original y suprimiento directamente en él el elemento indicado. Comprobamos que efectivamente la eliminación ha sido in-situ constatando que la invocación del método remove no ha devuelto ningún valor en el intérprete (si no sabes de qué estoy hablando, te aconsejo encarecidamente que te leas el artículo Hace falta valor, que te ayudará a comprender lo que está sucediendo entre bastidores).

El método remove tiene una limitación: sólo elimina la primera aparición del elemento en la lista. Pero, ¿y si queremos que desaparezca completamente si está repetido más veces?

Existen muchas formas de resolver esto; yo voy a mostrarte dos de las más elegantes.

La primera es casi obvia: descomponiendo el problema en otros más simples. La eliminación de muchos elementos no es más que la eliminación de uno solo unas cuantas veces.

Supongamos la siguiente colección de cine infantil:

cine = ['Bambi', 'Blancanieves', 'Emmanuelle', 'El rey león', 'Emmanuelle']

Parece que se nos ha colado alguna cinta ajena a la temática. El siguiente bucle las elimina de una en una aplicando el método remove:

>>> while 'Emmanuelle' in cine:
  cine.remove('Emmanuelle')

  
>>> cine
['Bambi', 'Blancanieves', 'El rey león']

Hemos hecho uso del operador in para comprobar la existencia del elemento en la lista.

Pero mi método favorito es recurriendo a la elegancia de las listas por comprensión.

Reconstruyamos nuestra colección original primero, modificada inapelablemente tras cada remove.

cine = ['Bambi', 'Blancanieves', 'Emmanuelle', 'El rey león', 'Emmanuelle']

Recordemos las distintas fases:

1) recorremos el iterable:

for peli in cine

2) escribimos a la izquierda la transformación deseada. No queremos transformar nada, sólo dejar cada película tal y como está:

peli for peli in cine

3) a la derecha escribimos la condición de filtrado:

peli for peli in cine if peli != 'Emmanuelle'

Estamos diciendo que sólo se seleccionen aquellos elementos distintos a ‘Emmanuelle’.

4) encerramos el conjunto entre llaves y ¡listo!:

>>> [peli for peli in cine if peli != 'Emmanuelle']
['Bambi', 'Blancanieves', 'El rey león']

Elegante. Acostúmbrate a usar las listas por comprensión, representan potencia sutil con la que podrás resolver numerosos problemas.

Aquí no es solo una cuestión de elegancia. Si te fijas, esta vez la invocación ha provocado que el intérprete devolviera un valor. Eso significa que ha sido creado un nuevo objeto.

En efecto, la lista original no ha sido afectada, como podemos comprobar:

>>> cine
['Bambi', 'Blancanieves', 'Emmanuelle', 'El rey león', 'Emmanuelle']

Lo que te permite recuperar Emmanuelle, todo un clásico del cine erótico digno de cualquier filmoteca que se precie.

Pero, si tu intención era esa, podrías haber procedido directamente del siguiente modo:

>>> cine = [peli for peli in cine if peli != 'Emmanuelle']
>>> cine
['Bambi', 'Blancanieves', 'El rey león']

Forzando así que la variable cine referencie ahora al nuevo objeto creado en lugar de al anterior, evitándote así oscuras tentaciones.

Javier Montero Gabarró


Python – Eliminación de múltiples elementos repetidos de una lista


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Consulta el índice completo de artículos relacionados con Python.

6 opiniones en “Python – Eliminación de múltiples elementos repetidos de una lista”

    1. Sí señor, buena observación, aunque tiene una importante limitación: los conjuntos son estructuras de datos no ordenadas. Al convertir a conjunto y reconvertir a lista de nuevo, pierdes la ordenación existente en originalmente en la lista. Además, según el caso, puede que no quieras eliminar todos los duplicados salvo uno en concreto.
      ¡Gracias por comentar!

  1. Tengo un pequeño problema con la repeticion de elementos en una lista. Mi objetivo es conseguir que se repita tan solo una vez: Imaginemonos que mi lista contiene [‘gazpacho’, ‘leche’, ‘manzana’, ‘peras’, ‘gazpacho’]
    Mi objetivo seria crear una nueva lista añadiendo elementos NO repetidos y es por ello que no puedo eliminar, en este caso, ‘gazpacho’ porque necesito que en mi nueva lista este presente pero sin repeticiones.
    Muy buen articulo y gracias por la ayuda.
    Saludos!

    1. La manera más simple de lograrlo es haciendo uso de una estructura de datos intermedia que no permita repeticiones: los conjuntos.
      Para ello, convierte previamente tu lista a conjunto y el resultado lo vuelves a pasar a lista.
      Por ejemplo, si tu lista se denomina lista, haz:
      list(set(lista))
      Saludos

Deja un comentario