我做了一个函数,它将在字典中查找年龄并显示匹配的名字:

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。我知道这是不正确的,但我不知道如何让它向后搜索。


当前回答

key = next((k for k in my_dict if my_dict[k] == val), None)

其他回答

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,因为前者是预定义的类型。

我也在寻找同样的问题,最后得到了我的变体: Found_key = [a[0] for a in dict.items() if a[1] == 'value'][0]

仅适用于键具有唯一值的情况(这就是我的情况)。

mydict = {'george': 16, 'amber': 19}
print mydict.keys()[mydict.values().index(16)]  # Prints george

或者在Python 3.x中:

mydict = {'george': 16, 'amber': 19}
print(list(mydict.keys())[list(mydict.values()).index(16)])  # Prints george

基本上,它将字典的值分离到一个列表中,找到所拥有值的位置,并在该位置获取键。

更多关于Python 3中的keys()和.values():如何从dict获取值列表?

在我的情况下,最简单的方法是实例化字典在你的代码,然后你可以从它调用键如下

这是我们班有字典

class Config:

def local(self):
    return {
        "temp_dir": "/tmp/dirtest/",
        "devops": "Mansur",
    }

实例化你的字典

config =  vars.Config()
local_config = config.local()

最后调用你的字典键

patched = local_config.get("devops")