Estoy tratando de eliminar duplicados de una lista anidada solo si los primeros 2 elementos son iguales, ignorando el tercero …
Lista:
L = [['el1','el2','value1'], ['el3','el4','value2'], ['el1','el2','value2'], ['el1','el5','value3']]
Volvería:
L = [['el3','el4','value2'], ['el1','el2','value2'], ['el1','el5','value3']]
He encontrado una manera simple de hacer similar aquí :
dict((x[0], x) for x in L).values()
pero esto solo funciona para el primer elemento y no para los primeros 2, pero eso es exactamente lo que quiero de otra manera.
Si el orden no importa, puedes usar el mismo método pero usando una tupla del primer y segundo elemento como clave:
dict(((x[0], x[1]), x) for x in L).values()
O en Python 2.7 y superior:
{(x[0], x[1]): x for x in L}.values()
En lugar de (x[0], x[1])
puede usar la tuple(x[:2])
, use la que encuentre más legible.
Si el orden importa, use un set
con solo los dos primeros elementos de sus listas anidadas:
seen = set() seen_add = seen.add return [x for x in seq if tuple(x[:2]) not in seen and not seen_add(tuple(x[:2]))]
o podría usar un objeto collections.OrderedDict()
para mantener el orden; mantenga las x[:2]
cortes como claves (como tuplas), y extraiga los valores:
from collections import OrderedDict( return OrderedDict((tuple(x[:2]), x) for x in seq).values()
En Python 3.6 y versiones posteriores, el tipo de dict estándar también retiene el orden de inserción:
return list({tuple(x[:2]): x for x in seq}.values())
La llamada a la list()
es necesaria para convertir el objeto de vista de diccionario en una lista.
esto debería hacerlo:
In [55]: dict((tuple(x[:2]), x) for x in L).values() Out[55]: [['el1', 'el2', 'value2'], ['el1', 'el5', 'value3'], ['el3', 'el4', 'value2']]