Получить ключ по значению в словаре - PullRequest
516 голосов
/ 06 ноября 2011

Я сделал функцию, которая будет искать возраст в Dictionary и показывать соответствующее имя:

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

Я знаю, как сравнивать и находить возраст, я просто не знаю, как показатьимя человека.Кроме того, я получаю KeyError из-за строки 5. Я знаю, что это не правильно, но я не могу понять, как заставить его искать в обратном направлении.

Ответы [ 34 ]

9 голосов
/ 06 июня 2013

Вот мой взгляд на эту проблему.:) Я только начал изучать Python, поэтому я называю это:

Решение "Understandable for начинающий"*

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

Provide age: 19

amber 19
Garry 19

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

Execution Successful!
8 голосов
/ 08 мая 2018

Я нашел этот ответ очень эффективным, но не очень легко читаемым для меня.

Чтобы сделать его более понятным, вы можете инвертировать ключ и значение словаря.Это сделать ключи значений и ключи значений, как показано здесь .

mydict = {'george':16,'amber':19}
res = dict((v,k) for k,v in mydict.iteritems())
print(res[16]) # Prints george

или

mydict = {'george':16,'amber':19}
dict((v,k) for k,v in mydict.iteritems())[16]

, что по сути то же самое, что этот другой ответ .

7 голосов
/ 18 августа 2017

Рассмотрите возможность использования панд. Как говорится в «Питоне для анализа данных» Уильяма Маккинни *

Еще один способ думать о Серии - это упорядоченная фиксированная длина dict, так как это отображение значений индекса на значения данных. Может быть используется во многих контекстах, где вы можете использовать dict.

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

Для запроса вашей серии сделайте следующее:

lookup_list[lookup_list.values == 19]

Что дает:

Out[1]: 
amber    19
dtype: int64

Если вам нужно что-то еще сделать с выходом, преобразующим Ответ в список может быть полезен:

answer = lookup_list[lookup_list.values == 19].index
answer = pd.Index.tolist(answer)
6 голосов
/ 20 сентября 2015

Здесь recover_key принимает словарь и значение для поиска в словаре.Затем мы перебираем ключи в словаре, сравниваем их со значением и возвращаем этот ключ.

def recover_key(dicty,value):
    for a_key in dicty.keys():
        if (dicty[a_key] == value):
            return a_key
5 голосов
/ 26 ноября 2017
get_key = lambda v, d: next(k for k in d if d[k] is v)
4 голосов
/ 02 июля 2017

Я знаю, что это старый, но вы могли бы довольно легко найти всех людей в списке с вашим возрастом поиска, используя понимание списка.

ages = {'george':16,'amber':19}
search = 16
print([name for (name, age) in ages.items() if age == search])
4 голосов
/ 21 сентября 2012
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
4 голосов
/ 07 марта 2016
def get_Value(dic,value):
    for name in dic:
        if dic[name] == value:
            del dic[name]
            return name
4 голосов
/ 31 мая 2013

ответили, но это можно сделать с помощью необычного использования «карта / уменьшение», например:

def find_key(value, dictionary):
    return reduce(lambda x, y: x if x is not None else y,
                  map(lambda x: x[0] if x[1] == value else None, 
                      dictionary.iteritems()))
3 голосов
/ 07 июля 2017

Надеюсь, это поможет ...

for key in list:
   if list[key] == search_value:
       return key
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...