Python字典 - 通过输入值找到密钥

时间:2014-09-18 10:49:39

标签: python dictionary

我有一些代码,但我不知道如何使用该值在字典中找到密钥。在这里,我有我的代码和我想做的事情:

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 combine(list1,list2):
    dictionary = dict(zip(list1,list2))
    return dictionary

def people(age):
    if leeftijd in dictionary:
        return ['Bob']


print combine(NAMES, AGES)

print people(21) == ['Bob'] 
print people(22) == ['Kelly']
print people(23) == []

在这段代码中,我首先使用combine函数将列表NAMES和AGES放入字典中,但现在我想创建一个名为people的第二个函数,它将输出具有年龄的所有人的名字你输入。

例如:如果我在该函数中输入21,它应该输出Bob,因为Bob是唯一一个21岁的人。

我只是不知道如何做到这一点,因为AGE不是我字典中的关键字,我也不能使用整数作为键。

6 个答案:

答案 0 :(得分:1)

正如我在comment AFAIK中所提到的,如果你不是通过字典进行线性搜索,那么你将不得不维护一个逆映射(字典),这将需要维护每个值的密钥列表(数据中有2个18岁,5个19岁,3个20岁)。

此代码包含一个(通用)函数reverse_dictionary(),它接受​​给定的字典并从中创建反向映射。函数中的nameage变量名称是我为此问题编写的赠品,但是将它们更改为keyvalue并且代码适用于任何字典值是可以清除的。

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 reverse_dictionary(fwd):
    rev = {}
    for name, age in fwd.items():
        if age not in rev:
            rev[age] = []
        rev[age].append(name)
    return rev

def combine(list1,list2):
    dictionary = dict(zip(list1,list2))
    return dictionary

def people(age, dictionary):
    if age not in dictionary:
        return []
    return dictionary[age]

name_age = combine(NAMES, AGES)
print name_age

age_name = reverse_dictionary(name_age)

for age in range(17, 24):
    print age, people(age, age_name)

示例输出:

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

请注意,这并不会使两个词典保持同步;如果您在name_age字典中添加新名称和年龄,则还需要将年龄和名称添加到反向字典中。另一方面,如果您加载名称/年龄图一次然后它保持稳定并且您需要根据年龄进行多次查找,那么反向字典可能比迭代通过名称/年龄字典的解决方案更有效每次搜索。

答案 1 :(得分:0)

实际上,据我所知,没有办法。

只需遍历你的词典:

people_array = combine(NAMES, AGES)
def people(age):
    for person in people_array:
        if people_array[person] == age:
            print(person)

答案 2 :(得分:0)

可以这样做

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

答案 3 :(得分:0)

尝试此功能(key_for_value):

def key_for_value(d, value):
    for k, v in d.iteritems():
        if v == value:
            return k
    raise ValueError("{!r} not found".format(value))


mydict = {1: "a", 2: "b", 3: "c"}

print key_for_value(mydict, "a")
print key_for_value(mydict, "d")

答案 4 :(得分:0)

一个很好的方法是:

def people(age):
    ages = [i for i,j in enumerate(combine.values()) if j == age]
    return [combine.keys()[i] for i in ages]

答案 5 :(得分:0)

试试这个:

def people(age):
    return map(lambda x: x[0], filter(lambda x: x[1]==age, dictionary.items()))