[python] Obtener clave por valor en el diccionario



Answers

mydict = {'george':16,'amber':19}
print mydict.keys()[mydict.values().index(16)] # Prints george

O en Python 3.x:

mydict = {'george':16,'amber':19}
print(list(mydict.keys())[list(mydict.values()).index(16)]) # Prints george

Básicamente, separa los valores del diccionario en una lista, encuentra la posición del valor que tiene y obtiene la clave en esa posición.

Más acerca de las keys() y .values() en Python 3: Python: la forma más sencilla de obtener una lista de valores de dict?

Question

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, KeyError un KeyError debido a la línea 5. Sé que no es correcto, pero no puedo encontrar la manera de hacerlo buscar hacia atrás.




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

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

El resultado es el siguiente:

-> prints george



Espero que esto ayude...

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



get_key = lambda v, d: next(k for k in d if d[k] is v)



Aquí está mi opinión sobre este problema. :) Acabo de empezar a aprender Python, así que llamo a esto:

La solución "comprensible para principiantes".

#Code without comments.

list1 = {'george':16,'amber':19, 'Garry':19}
search_age = raw_input("Provide age: ")
print
search_age = int(search_age)

listByAge = {}

for name, age in list1.items():
    if age == search_age:
        age = str(age)
        results = name + " " +age
        print results

        age2 = int(age)
        listByAge[name] = listByAge.get(name,0)+age2

print
print listByAge

.

#Code with comments.
#I've added another name with the same age to the list.
list1 = {'george':16,'amber':19, 'Garry':19}
#Original code.
search_age = raw_input("Provide age: ")
print
#Because raw_input gives a string, we need to convert it to int,
#so we can search the dictionary list with it.
search_age = int(search_age)

#Here we define another empty dictionary, to store the results in a more 
#permanent way.
listByAge = {}

#We use double variable iteration, so we get both the name and age 
#on each run of the loop.
for name, age in list1.items():
    #Here we check if the User Defined age = the age parameter 
    #for this run of the loop.
    if age == search_age:
        #Here we convert Age back to string, because we will concatenate it 
        #with the person's name. 
        age = str(age)
        #Here we concatenate.
        results = name + " " +age
        #If you want just the names and ages displayed you can delete
        #the code after "print results". If you want them stored, don't...
        print results

        #Here we create a second variable that uses the value of
        #the age for the current person in the list.
        #For example if "Anna" is "10", age2 = 10,
        #integer value which we can use in addition.
        age2 = int(age)
        #Here we use the method that checks or creates values in dictionaries.
        #We create a new entry for each name that matches the User Defined Age
        #with default value of 0, and then we add the value from age2.
        listByAge[name] = listByAge.get(name,0)+age2

#Here we print the new dictionary with the users with User Defined Age.
print
print listByAge

.

#Results
Running: *\test.py (Thu Jun 06 05:10:02 2013)

Provide age: 19

amber 19
Garry 19

{'amber': 19, 'Garry': 19}

Execution Successful!



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 ocurrencias usa:

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



Una forma simple de hacer esto podría ser:

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

Esto devolverá una lista de las claves con un valor que coincida con search_age. También puede reemplazar "list == search_age" con cualquier otra declaración de condiciones si es necesario.




A veces puede ser necesario int ():

titleDic = {'Фильмы':1, 'Музыка':2}

def categoryTitleForNumber(self, num):
    search_title = ''
    for title, titleNum in self.titleDic.items():
        if int(titleNum) == int(num):
            search_title = title
    return search_title



aquí está mi opinión sobre esto. Esto es bueno para mostrar resultados múltiples en caso de que lo necesite. Así que agregué la lista también

myList = {'george':16,'amber':19, 'rachel':19, 
           'david':15 }                         #Setting the dictionary
result=[]                                       #Making ready of the result list
search_age = int(input('Enter age '))

for keywords in myList.keys():
    if myList[keywords] ==search_age:
    result.append(keywords)                    #This part, we are making list of results

for res in result:                             #We are now printing the results
    print(res)

Y eso es...




Así es como accede al diccionario para hacer lo que desea:

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

por supuesto, sus nombres están tan apagados que parece que estaría imprimiendo una edad, pero IMPRIME el nombre. Como está accediendo por su nombre, se vuelve más comprensible si escribe:

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

Mejor todavía:

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



Pensé que sería interesante señalar qué métodos son los más rápidos y en qué situación:

Aquí hay algunas pruebas que ejecuté (en un MacBook Pro 2012)

>>> def method1(list,search_age):
...     for name,age in list.iteritems():
...             if age == search_age:
...                     return name
... 
>>> def method2(list,search_age):
...     return [name for name,age in list.iteritems() if age == search_age]
... 
>>> def method3(list,search_age):
...     return list.keys()[list.values().index(search_age)]

Resultados de profile.run() en cada método 100000 veces:

Método 1:

>>> profile.run("for i in range(0,100000): method1(list,16)")
     200004 function calls in 1.173 seconds

Método 2:

>>> profile.run("for i in range(0,100000): method2(list,16)")
     200004 function calls in 1.222 seconds

Método 3:

>>> profile.run("for i in range(0,100000): method3(list,16)")
     400004 function calls in 2.125 seconds

Esto muestra que para un dict pequeño, el método 1 es el más rápido. Esto es más probable porque devuelve la primera coincidencia, a diferencia de todas las coincidencias como el método 2 (ver nota a continuación).

Curiosamente, al realizar las mismas pruebas en un dict que tengo con 2700 entradas, obtengo resultados bastante diferentes (esta vez ejecuto 10000 veces):

Método 1:

>>> profile.run("for i in range(0,10000): method1(UIC_CRS,'7088380')")
     20004 function calls in 2.928 seconds

Método 2:

>>> profile.run("for i in range(0,10000): method2(UIC_CRS,'7088380')")
     20004 function calls in 3.872 seconds

Método 3:

>>> profile.run("for i in range(0,10000): method3(UIC_CRS,'7088380')")
     40004 function calls in 1.176 seconds

Entonces, aquí, el método 3 es mucho más rápido. Solo sirve para mostrar que el tamaño de tu dict afectará el método que elijas.

Notas: El Método 2 devuelve una lista de todos los nombres, mientras que los métodos 1 y 3 devuelven solo la primera coincidencia. No he considerado el uso de memoria. No estoy seguro de si el método 3 crea 2 listas adicionales (claves () y valores ()) y las almacena en la memoria.




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



Considera usar Pandas. Como se indica en "Python for Data Analysis" de William McKinney

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

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

Para consultar su serie haga lo siguiente:

lookup_list[lookup_list.values == 19]

Cuyos rendimientos:

Out[1]: 
amber    19
dtype: int64

Si necesita hacer algo más con la salida, transformar la respuesta en una lista podría ser útil:

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



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



Si desea encontrar la clave por el valor, puede usar una comprensión de diccionario para crear un diccionario de búsqueda y luego usar eso para encontrar la clave del valor.

lookup = {value: key for key, value in self.data}
lookup[value]



Related