Solución:
La comprensión de su lista pasa por todos los elementos del dict encontrando todas las coincidencias, luego solo devuelve la primera clave. Esta expresión generadora solo iterará tanto como sea necesario para devolver el primer valor:
key = next(key for key, value in dd.items() if value == 'value')
dónde dd
es el dict. Elevará StopIteration
si no se encuentra ninguna coincidencia, por lo que es posible que desee detectar eso y devolver una excepción más apropiada como ValueError
o KeyError
.
Hay casos en los que un diccionario es uno: un mapeo
P.ej,
d = {1: "one", 2: "two" ...}
Su enfoque está bien si solo está haciendo una búsqueda única. Sin embargo, si necesita hacer más de una búsqueda, será más eficiente crear un diccionario inverso.
ivd = {v: k for k, v in d.items()}
Si existe la posibilidad de varias claves con el mismo valor, deberá especificar el comportamiento deseado en este caso.
Si su Python es 2.6 o anterior, puede usar
ivd = dict((v, k) for k, v in d.items())
Esta versión es un 26% más corta que la suya, pero funciona de manera idéntica, incluso para valores redundantes / ambiguos (devuelve la primera coincidencia, como la suya). Sin embargo, probablemente sea dos veces más lento que el suyo, porque crea una lista a partir del dict dos veces.
key = dict_obj.keys()[dict_obj.values().index(value)]
O si prefiere la brevedad a la legibilidad, puede guardar un carácter más con
key = list(dict_obj)[dict_obj.values().index(value)]
Y si prefiere la eficiencia, el enfoque de @ PaulMcGuire es mejor. Si hay muchas claves que comparten el mismo valor, es más eficiente no crear una instancia de esa lista de claves con una lista de comprensión y, en su lugar, usar un generador:
key = (key for key, value in dict_obj.items() if value == 'value').next()