¿Cómo obtener todas las claves del diccionario de un valor?

Tengo un diccionario en un formato como este.

d = { "Fruit_1" : ["mango", "apple"], "Fruit_2" : ["apple"], "Fruit_3" : ["mango", "banana", "apple", "kiwi", "orange"] } 

Estoy pasando un valor como “mango” y quiero obtener todas las claves correspondientes donde solo ocurre el mango. No puedo obtener las claves correspondientes donde quiera que ocurra el valor.

Puede hacer esto tal vez:

 d = { "Fruit_1" : ["mango", "apple"], "Fruit_2" : ["apple"], "Fruit_3" : ["mango", "banana", "apple", "kiwi", "orange"] } # list comprehension mango_keys = [fruit for fruit in d.keys() if "mango" in d[fruit]] print(mango_keys) # ['Fruit_1', 'Fruit_3'] # or more traditional for-loop (but non pythonic) for fruit in d.keys(): if "mango" in d[fruit]: print(fruit) 

d.items en d.items y verificar la existencia del mango en valor.

 In [21]: [key for key,value in d.items() if 'mango' in value] Out[21]: ['Fruit_1', 'Fruit_3'] 

Los enfoques ingenuos (repitiendo todos los elementos y buscando la fruta) funcionan pero tienen una gran complejidad, sobre todo si hay que realizar muchas solicitudes. Podría mejorarlo un poco al reemplazar los valores de su list por un set (para una búsqueda más rápida), pero aún sería lento ( O(n**2) => O(n) pero podría mejorarse).

Si desea poder realizar esas consultas muchas veces, sería mejor reconstruir el diccionario para que la búsqueda sea muy rápida una vez que se haya creado, utilizando collections.defaultdict

 d = { "Fruit_1" : ["mango", "apple"], "Fruit_2" : ["apple"], "Fruit_3" : ["mango", "banana", "apple", "kiwi", "orange"] } import collections newd = collections.defaultdict(list) for k,vl in d.items(): for v in vl: newd[v].append(k) print(newd) print(newd["mango"]) 

este es el dict reconstruido

 defaultdict(, {'apple': ['Fruit_2', 'Fruit_3', 'Fruit_1'], 'orange': ['Fruit_3'], 'banana': ['Fruit_3'], 'kiwi': ['Fruit_3'], 'mango': ['Fruit_3', 'Fruit_1']}) 

Esta es la consulta para “mango”:

 ['Fruit_3', 'Fruit_1'] 

¿Me gusta esto?

 >>> d = { ... "Fruit_1" : ["mango", "apple"], ... "Fruit_2" : ["apple"], ... "Fruit_3" : ["mango", "banana", "apple", "kiwi", "orange"] ... } >>> >>> [key for key, value in d.items() if 'mango' in value] ['Fruit_1', 'Fruit_3'] 

La idea es iterar sobre los pares (clave, valor) y verificar cada valor para la existencia de 'mango' . Si es así, mantenga la llave.

Ya que eres nuevo en Python, esta es la lógica tradicional for -loop:

 >>> result = [] >>> for key, value in d.items(): ... if 'mango' in value: ... result.append(key) ... >>> result ['Fruit_1', 'Fruit_3'] 

Para una sola consulta, puede utilizar una lista de comprensión. Esto tendrá una complejidad de tiempo O ( n ) cada vez que busque un valor:

 res = [k for k, v in d.items() if 'mango' in v] 

Para consultas múltiples, puede usar un punto por defaultdict de objetos set través de un costo único de O ( n ):

 from collections import defaultdict dd = defaultdict(set) for k, v in d.items(): for fruit in v: dd[fruit].add(k) print(dd) defaultdict({'mango': {'Fruit_1', 'Fruit_3'}, 'apple': {'Fruit_1', 'Fruit_2', 'Fruit_3'}, 'banana': {'Fruit_3'}, 'kiwi': {'Fruit_3'}, 'orange': {'Fruit_3'}}) 

Luego puede usar dd['mango'] para extraer claves relevantes.