Mi pregunta puede ser un poco complicada de entender, pero aquí está la cuestión. Tengo un diccionario nested que se parece a esto:
dict_a = {'one': {'bird':2, 'tree':6, 'sky':1, 'TOTAL':9}, 'two': {'apple':3, 'sky':1, 'TOTAL':4}, 'three': {'tree':6, 'TOTAL':6}, 'four': {'nada':1, 'TOTAL':1}, 'five': {'orange':2, 'bird':3, 'TOTAL':5} }
y una lista:
list1 = ['bird','tree'] newlist = []
¿cómo puedo verificar los elementos en la lista1 si están en el diccionario nested de dict_a y agregarlos a la lista nueva? La salida debería verse así:
newlist = ['one','three','five']
Ya que el pájaro y el árbol estaban en el diccionario nested de uno, tres y cinco.
Lo que puedo pensar es:
for s,v in dict_a.items(): for s1,v1 in v.items(): for item in list1: if item == s1: newlist.append(s)
Haga de list1
un conjunto y use vistas de diccionario y una lista de comprensión:
set1 = set(list1) newlist = [key for key, value in dict_a.iteritems() if value.viewkeys() & set1]
En Python 3, use value.keys()
y dict_a.items
en dict_a.items
lugar.
Esto prueba si hay una intersección de conjunto entre las claves del diccionario y el conjunto de claves que está buscando (una operación eficiente).
Manifestación:
>>> dict_a = {'one': {'bird':2, 'tree':6, 'sky':1, 'TOTAL':9}, ... 'two': {'apple':3, 'sky':1, 'TOTAL':4}, ... 'three': {'tree':6, 'TOTAL':6}, ... 'four': {'nada':1, 'TOTAL':1}, ... 'five': {'orange':2, 'bird':3, 'TOTAL':5} ... } >>> set1 = {'bird','tree'} >>> [key for key, value in dict_a.iteritems() if value.viewkeys() & set1] ['three', 'five', 'one']
Tenga en cuenta que el orden del diccionario es arbitrario (según las claves utilizadas y el historial de inserción y eliminación del diccionario), por lo que el orden de la lista de salida puede diferir.
Técnicamente hablando, también puede usar su lista directamente ( value.viewkeys() & list1
funciona), pero al hacer que un conjunto value.viewkeys() & list1
su intención más claramente.