Compruebe si hay artículos en una lista en el diccionario

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.