Найти ключи по значениям в dict для Python - PullRequest
2 голосов
/ 03 февраля 2011
NAMES  =  ['Alice', 'Bob','Cathy','Dan','Ed','Frank',
           'Gary','Helen','Irene','Jack', 'Kelly','Larry'] 
AGES  =  [20,21,18,18,19,20,20,19,19,19,22,19]

def nameage(a,b):
    nameagelist = [x for x in zip(a,b)]
    nameagedict = dict(nameagelist)

    return nameagedict

def name(a):
    for x in nameage(NAMES,AGES):
        if a in nameage(NAMES,AGES).values():
            print nameage(NAMES,AGES).keys()

print name(19)

Я пытаюсь вернуть имена людей в возрасте 19 лет. Как мне найти словарь по значению и вернуть ключ?

Ответы [ 3 ]

9 голосов
/ 03 февраля 2011
print [key for (key,value) in nameagedict.items() if value == 19]

nameagedict.items() предоставляет список всех элементов в словаре в виде (ключ, значение) кортежей.

0 голосов
/ 24 июля 2015

Частичное решение

names = {age:sorted([name for index,name in enumerate(NAMES) if age == AGES[index]]) for age in sorted(set(AGES))}
print(names)

Возвращает:

{18: ['Cathy', 'Dan'], 19: ['Ed', 'Helen', 'Irene', 'Jack', 'Larry'], 20: ['Alice', 'Frank', 'Gary'], 21: ['Bob'], 22: ['Kelly']}

Оставьте отсортированными (), если хотите. Вы также можете добавить count (), чтобы данные возвращали что-то вроде

{18: [('Cathy',3), ('Dan',7), ...} 

, если было 3 Кэти и 7 Данов.

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

Или даже лучше:

def names(age):
    index = 0
    while index < len(AGES):
        if AGES[index] == age:
            yield NAMES[index]
        index += 1

print('19 year olds')
for name in names(19):
    print(name)
0 голосов
/ 04 ноября 2013

У меня была похожая проблема.Вот мое решение, которое возвращает ключи и значения в виде массива кортежей.

filter(lambda (k,v): v==19, nameagedict.items())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...