Получить ключ по значению в словаре - 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 ]

1 голос
/ 02 июля 2015

Вот как вы получаете доступ к словарю, чтобы делать то, что вы хотите:

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

Конечно, ваши имена настолько не похожи, что похоже на то, что вы печатаете возраст, но это НЕ печатает имя. Поскольку вы обращаетесь по имени, становится понятнее, если вы напишите:

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

Еще лучше:

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
1 голос
/ 15 января 2019

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

d = {'Adams': [18, 29, 30],
     'Allen': [9, 27],
     'Anderson': [24, 26],
     'Bailey': [7, 30],
     'Baker': [31, 7, 10, 19],
     'Barnes': [22, 31, 10, 21],
     'Bell': [2, 24, 17, 26]}

Теперь давайте найдем имена, которые имеют 24 в своих значениях.

for key in d.keys():    
    if 24 in d[key]:
        print(key)

Это также будет работать с несколькими значениями.

0 голосов
/ 17 октября 2014

Вот решение, которое работает как в Python 2, так и в Python 3:

dict((v, k) for k, v in list.items())[search_age]

Часть до [search_age] создает обратный словарь (где значения являются ключами и наоборот).Вы можете создать вспомогательный метод, который будет кешировать этот обратный словарь, например:

def find_name(age, _rev_lookup=dict((v, k) for k, v in ages_by_name.items())):
    return _rev_lookup[age]

или, в более общем случае, фабрику, которая создаст метод поиска по возрасту для одного или нескольких списков

def create_name_finder(ages_by_name):
    names_by_age = dict((v, k) for k, v in ages_by_name.items())
    def find_name(age):
      return names_by_age[age]

, чтобы вы могли сделать:

find_teen_by_age = create_name_finder({'george':16,'amber':19})
...
find_teen_by_age(search_age)

Обратите внимание, что я переименовал list в ages_by_name, поскольку первый тип является предопределенным.

0 голосов
/ 28 июля 2017

Простой способ сделать это может быть:

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

Это вернет список ключей со значением, которое соответствует search_age.Вы также можете заменить «list == search_age» любым другим условным оператором, если необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...