按字典中的值返回键

时间:2013-05-16 13:07:18

标签: python dictionary python-3.x key

我试图在给定值的字典中返回密钥

在这种情况下,如果'b'在字典中,我希望它返回'b'所在的键(即2)

def find_key(input_dict, value):
    if value in input_dict.values():
        return UNKNOWN            #This is a placeholder
    else:
        return "None"

print(find_key({1:'a', 2:'b', 3:'c', 4:'d'}, 'b'))

我想得到的答案是关键2,但我不确定应该放什么以获得答案,任何帮助都将不胜感激

2 个答案:

答案 0 :(得分:12)

返回第一个匹配键:

def find_key(input_dict, value):
    return next((k for k, v in input_dict.items() if v == value), None)

所有匹配键作为一组返回:

def find_key(input_dict, value):
    return {k for k, v in input_dict.items() if v == value}

字典中的值不一定是唯一的。如果没有匹配,则第一个选项返回None,第二个选项返回该情况的空集。

由于词典的顺序是任意的(取决于使用的键和插入和删除历史),所以被认为是“第一”键也是任意的。

演示:

>>> def find_key(input_dict, value):
...     return next((k for k, v in input_dict.items() if v == value), None)
... 
>>> find_key({1:'a', 2:'b', 3:'c', 4:'d'}, 'b')
2
>>> find_key({1:'a', 2:'b', 3:'c', 4:'d'}, 'z') is None
True
>>> def find_key(input_dict, value):
...     return {k for k, v in input_dict.items() if v == value}
... 
>>> find_key({1:'a', 2:'b', 3:'c', 4:'d'}, 'b')
set([2])
>>> find_key({1:'a', 2:'b', 3:'c', 4:'d', 5:'b'}, 'b')
set([2, 5])
>>> find_key({1:'a', 2:'b', 3:'c', 4:'d'}, 'z')
set([])

请注意,每次我们需要搜索匹配的键时,我们都需要循环遍历值。这不是最有效的方法,特别是如果您需要经常将值与键匹配。在这种情况下,创建一个反向索引:

from collections import defaultdict

values_to_keys = defaultdict(set)

for key, value in input_dict:
    values_to_keys[value].add(key)

现在你可以直接在O(1)(常数)时间内询问这组键:

keys = values_to_keys.get(value)

这使用集合;字典也没有排序,所以集合在这里更有意义。

答案 1 :(得分:7)

修改你的功能:

def find_key_for(input_dict, value):    
    for k, v in input_dict.items():
        if v == value:
            yield k

然后获取第一个键(或None,如果不存在)

print next(find_key_for(your_dict, 'b'), None)

获得所有职位:

keys = list(find_key_for(your_dict, 'b'))

或者,要获得许多关键字:

from itertools import islice
keys = list(islice(find_key_for(your_dict, 'b'), 5))

注意 - 按照字典迭代的顺序,你得到的密钥将是'n'。

如果您经常这样做(并且您的价值观可以播放),那么您可能希望转置您的词典

from collections import defaultdict

dd = defaultdict(list)
for k, v in d.items():
    dd[v].append(k)

print dd['b']