我做了一个函数,它将在字典中查找年龄并显示匹配的名字:
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。我知道这是不正确的,但我不知道如何让它向后搜索。
Cat Plus Plus提到,字典并不是这样使用的。原因如下:
字典的定义类似于数学中的映射。在这种情况下,字典是K(键集)到V(值)的映射-反之亦然。如果对字典进行解引用,则希望只返回一个值。但是,不同的键映射到相同的值是完全合法的,例如:
d = { k1 : v1, k2 : v2, k3 : v1}
当你根据键的对应值查找它时,你实际上是在颠倒字典。但是映射并不一定是可逆的!在这个例子中,请求v1对应的键可以得到k1或k3。你应该把两者都退回吗?只是第一个发现的?这就是为什么indexof()对于字典是未定义的。
如果你知道你的数据,你可以这样做。但是API不能假设任意字典是可逆的,因此缺少这样的操作。
下面是一个在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,因为前者是预定义的类型。
我发现这个答案很有效,但对我来说不太容易理解。
为了使它更清楚,您可以反转字典的键和值。这是使键值和值键,如这里所示。
mydict = {'george':16,'amber':19}
res = dict((v,k) for k,v in mydict.iteritems())
print(res[16]) # Prints george
或者Python 3,(谢谢@kkgarg)
mydict = {'george':16,'amber':19}
res = dict((v,k) for k,v in mydict.items())
print(res[16]) # Prints george
Also
print(res.get(16)) # Prints george
本质上和另一个答案是一样的。
考虑使用Pandas。正如William McKinney的《Python for Data Analysis》中所述
另一种考虑级数的方法是固定长度的有序级数
Dict,因为它是索引值到数据值的映射。它可以是
在很多情况下,你可能会用到字典。
import pandas as pd
list = {'george':16,'amber':19}
lookup_list = pd.Series(list)
要查询您的系列,请执行以下操作:
lookup_list[lookup_list.values == 19]
收益率:
Out[1]:
amber 19
dtype: int64
如果您需要对输出进行任何其他转换
回答成一个列表可能有用:
answer = lookup_list[lookup_list.values == 19].index
answer = pd.Index.tolist(answer)