返回第一个匹配的键:
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)
这里使用了集合;由于字典没有顺序,所以在这里使用集合更为合理。