Tengo un diccionario d1
y una lista l1
.comprensión del diccionario de Python muy lento
Las claves del diccionario son cadenas, y los valores son Objetos que yo mismo he definido. Si ayuda, puedo describir el Objeto con más detalle, pero por ahora, los objetos tienen un atributo de lista names
, y algunos de los elementos de name
pueden aparecer o no en l1
.
Lo que quería hacer era tirar a la basura cualquier elemento del diccionario d1
, en el que el atributo name
del objeto en dicho elemento no contiene ninguno de los elementos que aparecen en l1
.
Como un ejemplo trivial:
l1 = ['cat', 'dog', 'mouse', 'horse', 'elephant',
'zebra', 'lion', 'snake', 'fly']
d1 = {'1':['dog', 'mouse', 'horse','orange', 'lemon'],
'2':['apple', 'pear','cat', 'mouse', 'horse'],
'3':['kiwi', 'lime','cat', 'dog', 'mouse'],
'4':['carrot','potato','cat', 'dog', 'horse'],
'5':['chair', 'table', 'knife']}
por lo que el diccionario resultante será más o menos la misma, pero los elementos de cada lista serán los pares de valores clave de 1
-4
excluyendo las frutas y hortalizas, y no contendrá una 5ª par clave-valor, ya que ninguno de los valores de mobiliario aparece en l1
.
Para ello he utilizado una lista anidada/comprensión de diccionario que se veía así:
d2 = {k: [a for a in l1 if a in d1[k]] for k in d1.keys()}
print(d2)
>>>>{'1': ['dog', 'mouse', 'horse'],
'3': ['cat', 'dog', 'mouse'],
'2': ['cat', 'mouse', 'horse'],
'5': [],
'4': ['cat', 'dog', 'horse']}
d2 = {k: v for k,v in d2.iteritems() if len(v)>0}
print(d2)
>>>>{'1': ['dog', 'mouse', 'horse'],
'3': ['cat', 'dog', 'mouse'],
'2': ['cat', 'mouse', 'horse'],
'4': ['cat', 'dog', 'horse'],}
Esto parece funcionar, pero para grandes diccionarios, artículos de 7000, se tarda unos 20 segundos para trabajar a través. En sí mismo, no es horrible, pero necesito hacer esto dentro de un bucle que iterará 10.000 veces, por lo que actualmente no es factible. ¿Alguna sugerencia sobre cómo hacer esto rápidamente?
Nota para todos: Él está usando Python 2.7 no 3 debido al uso de 'itertitems', no deje que el' de impresión() 'te engaña – jamylak
python 2.7 tiene comprensión dicto? – Claudiu
@Claudiu Sí, fueron backported – jamylak