La manera más conveniente, "Pythonic" para eliminar duplicados de una lista es básicamente:la eliminación de duplicados utilizando comparaciones personalizados
mylist = list(set(mylist))
Pero supongamos que su criterio para contar un duplicado depende de un campo miembro particular de los objetos contenidos en mylist
.
Bueno, una solución es simplemente definir __eq__
__hash__
y de los objetos en mylist
, y luego el clásico list(set(mylist))
va a funcionar.
Pero a veces tiene requisitos que requieren un poco más de flexibilidad. Sería muy conveniente poder crear lambdas sobre la marcha para usar rutinas de comparación personalizadas para identificar duplicados de diferentes maneras. Idealmente, algo así como:
mylist = list(set(mylist, key = lambda x: x.firstname))
Por supuesto, que en realidad no funciona porque el constructor set
no toma una función de comparación, y set
requiere llaves hashable también.
Entonces, ¿cuál es la forma más cercana de lograr algo así, para que pueda eliminar duplicados utilizando funciones de comparación arbitrarias?
Esa es la forma más fácil de hacerlo. Y el rendimiento debería ser casi igual al método establecido. – Chronial
Wow, nunca antes había visto la sintaxis '{x.firstname: x for x in mylist}'. Cómo se llama y dónde puedo encontrarlo en los documentos. –
@MarwanAlsabbagh: Es una [comprensión de dict] (http://www.python.org/dev/peps/pep-0274/). Fue agregado en Python 2.7 y 3.0. Es equivalente a 'dict ((x.firstname, x) para x en mylist)'. – interjay