返回第一个匹配键:
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)
这使用集合;字典也没有排序,所以集合在这里更有意义。