我做了一个函数,它将在字典中查找年龄并显示匹配的名字:
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
我知道如何比较和查找年龄,只是不知道如何显示这个人的名字。此外,由于第5行,我得到了一个KeyError。我知道这是不正确的,但我不知道如何让它向后搜索。
这是一个奇怪的问题,因为第一条评论就给出了完美的答案。
根据样例提供的数据示例
dictionary = {'george': 16, 'amber': 19}
print(dictionary["george"])
它返回
16
所以你想要相反的结果
输入“16”,得到“george”
简单地交换键值和presto
dictionary = {'george': 16, 'amber': 19}
inv_dict = {value:key for key, value in dictionary.items()}
print(inv_dict[16])
我处于完全相反的位置,因为我有一本字典
{16:'george', 19:'amber'}
我试着喂"乔治"然后得到16个…我尝试了几种循环和迭代器,OK..他们工作,但它不是简单的一行解决方案,我将使用快速结果…所以我简单地交换了解。
如果我错过了什么,请让我知道删除我的答案。
如果你想要名字和年龄,你应该使用.items(),它会给你key (key, value)元组:
for name, age in mydict.items():
if age == search_age:
print name
您可以在for循环中将元组解包为两个单独的变量,然后匹配年龄。
如果你通常要根据年龄查找,而且没有两个人的年龄相同,你还应该考虑颠倒字典:
{16: 'george', 19: 'amber'}
所以你可以通过这样做来查找这个名字
mydict[search_age]
我一直称它为mydict而不是list,因为list是内置类型的名称,你不应该将这个名称用于其他任何类型。
你甚至可以在一行中得到给定年龄的所有人的列表:
[name for name, age in mydict.items() if age == search_age]
或者如果每个年龄只有一个人:
next((name for name, age in mydict.items() if age == search_age), None)
如果没有这个年龄的人,就会给你None。
最后,如果字典很长并且你使用的是Python 2,你应该考虑使用.iteritems()而不是像Cat Plus Plus在他的回答中所做的那样使用.items(),因为它不需要复制列表。
这是你访问字典做你想做的事情的方式:
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
下面是一个在python2和python3中都适用的解决方案:
dict((v, k) for k, v in list.items())[search_age]
直到[search_age]的部分构造反向字典(其中值是键,反之亦然)。
你可以创建一个helper方法来缓存这个反向字典,就像这样:
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,因为前者是预定义的类型。