Python 为dict中的值获取键的最有效方法

Python 为dict中的值获取键的最有效方法,python,Python,我有一本对象词典: dic = {'k1':obj1, 'k2':obj2, 'k3':obj3, ...} class MyObject: def __init__(self,x,y): self.x=x self.y=y 我想知道如何找到与值对应的键的最佳实现。相当于: def find_key(dic, val): for k,v in dic.items(): if v==val: return

我有一本对象词典:

dic = {'k1':obj1, 'k2':obj2, 'k3':obj3, ...}

class MyObject:
    def __init__(self,x,y):
        self.x=x
        self.y=y
我想知道如何找到与值对应的键的最佳实现。相当于:

def find_key(dic, val):
    for k,v in dic.items():
        if v==val:
            return k
    return None

注意:很抱歉,如果这是显而易见的,我是Python的新手:-)

忽略samb8s带来的可能性,即单个值存在多个键,您可以像这样轻松地反转字典:

reverse_dic = dict((v, k) for k, v in dic.items())
这将返回一组具有该值的所有键,如按值筛选:

def find_keys(dic, val):
    return set(k for k,v in dic.items() if v == val)

您可以使用列表理解。此代码提供列表中的键:

>>> a
{1: 2, 3: 4, 9: 4, 5: 6, 7: 8}
>>> [key for key, value in a.items() if value == 4]
[3, 9]

常规dict[key]->值

my_regular_dict = {1: 2, 3: 4, 5: 6}
反向查找,dict[值]->键

my_reverse_lookup = dict([(val, key) for key, val in my_regular_dict.items()])

如果多个键都有这个值呢?如果你在谷歌上搜索过它,你也会发现这一点如果你想经常反向映射,我建议你看看下面的问题:而且-我不知道足够多的python来确定你不能比你在问题中写的做得更好,但我会非常惊讶。对不起,我简化了问题,因此得到了与我的场景不匹配的非常好的答案:不相同的值或
iteritems
,如果它非常大。这只会使字典失效-它不会像OP所问的那样显式返回值的键。@Nate,我想他们到时候就能在新字典里找到这个词了。