¿Forma óptima de eliminar duplicados?

Arnau Sanchez pyarnau en gmail.com
Mar Jul 29 22:09:13 CEST 2008


Chema Cortes escribió:

> Si quieres mantener el orden hay un truco (aunque no recomiendo utilizarlo):
> 
>   [i for i in lista if i not in locals()["_[1]"]]
> 
> Es mejor emplear otras cosas como
> 
> def nodup(s,i):
>   return s if i in s else s+[i]
> 
> reduce(nodup, lista, [] )

Ahí va otra solución que mantiene el orden, pero usando un generador, puede 
resultar útil en según qué circunstancias:

def uniq(iterable):
     seen = set()
     for x in iterable:
         if x not in seen:
             seen.add(x)
             yield x

 > Lástima que "reduce" vaya a desaparecer de python 3000.

Bueno, desaparece como built-in, pero sigue disponible en el módulo "functools". 
Sabiendo el poco aprecio que GvR le tiene, me parece un compromiso aceptable.

$ python3k
Python 3.0a5 (r30a5:62856, Jun  6 2008, 22:17:19)
[GCC 4.2.4 (Debian 4.2.4-1)] on linux2

 >>> import functools
 >>> functools.reduce(lambda acc, x: acc + x, [1,2,3])
6
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es