我有一些代码,但我不知道如何使用该值在字典中找到密钥。在这里,我有我的代码和我想做的事情:
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不是我字典中的关键字,我也不能使用整数作为键。
答案 0 :(得分:1)
正如我在comment AFAIK中所提到的,如果你不是通过字典进行线性搜索,那么你将不得不维护一个逆映射(字典),这将需要维护每个值的密钥列表(数据中有2个18岁,5个19岁,3个20岁)。
此代码包含一个(通用)函数reverse_dictionary()
,它接受给定的字典并从中创建反向映射。函数中的name
和age
变量名称是我为此问题编写的赠品,但是将它们更改为key
和value
并且代码适用于任何字典值是可以清除的。
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()))