python agregar - Obtener clave por valor en el diccionario




15 Answers

No hay ninguno. dict no está destinado a ser utilizado de esta manera.

for name, age in dictionary.items():    # for name, age in dictionary.iteritems():  (for Python 2.x)
    if age == search_age:
        print(name)
elementos un

Hice una función que buscará las edades en un Dictionary y mostrará el nombre correspondiente:

dictionary = {'george' : 16, 'amber' : 19}
search_age = raw_input("Provide age")
for age in dictionary.values():
    if age == search_age:
        name = dictionary[age]
        print name

Sé cómo comparar y encontrar la edad, simplemente no sé cómo mostrar el nombre de la persona. Además, estoy recibiendo un KeyError debido a la línea 5. Sé que no es correcto, pero no puedo averiguar cómo hacer que busque hacia atrás.




Si desea el nombre y la edad, debe usar .items() que le proporciona tuplas clave (key, value) :

for name, age in mydict.items():
    if age == search_age:
        print name

Puede desempaquetar la tupla en dos variables separadas justo en el bucle for , luego hacer coincidir la edad.

También debe considerar invertir el diccionario si generalmente va a buscar por edad y no hay dos personas que tengan la misma edad:

{16: 'george', 19: 'amber'}

para que pueda buscar el nombre de una edad simplemente haciendo

mydict[search_age]

Lo he estado llamando mydict lugar de list porque list es el nombre de un tipo incorporado, y no deberías usar ese nombre para nada más.

Incluso puede obtener una lista de todas las personas con una edad determinada en una línea:

[name for name, age in mydict.items() if age == search_age]

o si solo hay una persona con cada edad:

next((name for name, age in mydict.items() if age == search_age), None)

que solo te dará None si no hay nadie con esa edad.

Finalmente, si el dict es largo y estás en Python 2, deberías considerar usar .iteritems() lugar de .items() como hizo Cat Plus Plus en su respuesta, ya que no es necesario hacer una copia del lista.




versión de una línea: (i es un diccionario antiguo, p es un diccionario invertido)

explicación: i.keys () y i.values ​​() devuelven dos listas con claves y valores del diccionario respectivamente. La función zip tiene la capacidad de unir listas para producir un diccionario.

advertencia: esto funcionaría solo si los valores son hashable y únicos.

p = dict(zip(i.values(),i.keys()))



lKey = [key for key, value in lDictionary.iteritems() if value == lValue][0]



Puede obtener la clave utilizando los dict.keys() , dict.values() y list.index() , consulte los ejemplos de código a continuación:

names_dict = {'george':16,'amber':19}
search_age = int(raw_input("Provide age"))
key = names_dict.keys()[names_dict.values().index(search_age)]



Considere el uso de Pandas. Como se indica en "Análisis de datos 'de Python de William McKinney

Otra forma de pensar acerca de una serie es como un dictado ordenado de longitud fija, ya que es un mapeo de valores de índice a valores de datos. Se puede utilizar en muchos contextos en los que puede usar un dict.

import pandas as pd
list = {'george':16,'amber':19}
lookup_list = pd.Series(list)

Para consultar tu serie haz lo siguiente:

lookup_list[lookup_list.values == 19]

Cuyos rendimientos:

Out[1]: 
amber    19
dtype: int64

Si necesita hacer algo más con el resultado, puede ser útil transformar la respuesta en una lista:

answer = lookup_list[lookup_list.values == 19].index
answer = pd.Index.tolist(answer)



for name in mydict.keys():
    if mydict[name] == search_age:
        print name 
        #or do something else with it. 
        #if in a function append to a temporary list, 
        #then after the loop return the list



def get_Value(dic,value):
    for name in dic:
        if dic[name] == value:
            del dic[name]
            return name



Pruebe este one-liner para revertir un diccionario:

reversed_dictionary = dict(map(reversed, dictionary.items()))



No hay una manera fácil de encontrar una clave en una lista "buscando el valor". Sin embargo, si conoce el valor, iterando a través de las teclas, puede buscar valores en el diccionario por elemento. Si D [elemento] donde D es un objeto de diccionario, es igual a la clave que está intentando buscar, puede ejecutar algún código.

D = {'Ali': 20, 'Marina': 12, 'George':16}
age = int(input('enter age:\t'))  
for element in D.keys():
    if D[element] == age:
        print(element)



Espero que esto ayude...

for key in list:
   if list[key] == search_value:
       return key



Cat Plus Plus mencionó que no es así como se pretende usar un diccionario. Este es el por qué:

La definición de un diccionario es análoga a la de un mapeo en matemáticas. En este caso, un dict es un mapeo de K (el conjunto de teclas) a V (los valores), pero no al revés. Si no hace referencia a un dictado, espera obtener exactamente un valor devuelto. Pero, es perfectamente legal que diferentes claves se asignen al mismo valor, por ejemplo:

d = { k1 : v1, k2 : v2, k3 : v1}

Cuando busca una clave por su valor correspondiente, básicamente está invirtiendo el diccionario. ¡Pero un mapeo no es necesariamente invertible! En este ejemplo, pedir la clave correspondiente a v1 podría producir k1 o k3. ¿Debes devolver ambos? ¿Sólo el primero encontrado? Es por eso que indexof () no está definido para los diccionarios.

Si conoces tus datos, podrías hacer esto. Pero una API no puede asumir que un diccionario arbitrario es invertible, por lo tanto, la falta de tal operación.




Necesitas usar un diccionario y reverso de ese diccionario. Significa que necesitas otra estructura de datos. Si está en Python 3, use el módulo de enum , pero si está usando python 2.7, use enum34 que está enum34 para Python 2.

Ejemplo:

from enum import Enum

class Color(Enum): 
    red = 1 
    green = 2 
    blue = 3

>>> print(Color.red) 
Color.red

>>> print(repr(Color.red)) 
<color.red: 1=""> 

>>> type(Color.red) 
<enum 'color'=""> 
>>> isinstance(Color.green, Color) 
True 

>>> member = Color.red 
>>> member.name 
'red' 
>>> member.value 
1 



d= {'george':16,'amber':19}

dict((v,k) for k,v in d.items()).get(16)

La salida es la siguiente:

-> prints george



dictionary = {'george' : 16, 'amber' : 19}
search_age = raw_input("Provide age")
key = [filter( lambda x: dictionary[x] == k  , dictionary ),[None]][0] 
# key = None from [None] which is a safeguard for not found.

Para múltiples casos de uso:

keys = [filter( lambda x: dictionary[x] == k  , dictionary )]



Related

python dictionary