use*_*517 3 python dictionary key python-3.x
我试图在给定值的字典中返回密钥
在这种情况下,如果'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'))
Run Code Online (Sandbox Code Playgroud)
我想得到的答案是关键2,但我不确定要放什么以获得答案,任何帮助将不胜感激
Mar*_*ers 14
返回第一个匹配键:
def find_key(input_dict, value):
return next((k for k, v in input_dict.items() if v == value), None)
Run Code Online (Sandbox Code Playgroud)
将所有匹配的键作为一组返回:
def find_key(input_dict, value):
return {k for k, v in input_dict.items() if v == value}
Run Code Online (Sandbox Code Playgroud)
字典中的值不一定是唯一的.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([])
Run Code Online (Sandbox Code Playgroud)
请注意,每次需要搜索匹配的键时,我们都需要循环遍历值.这不是最有效的方法,特别是如果您需要经常将值与键匹配.在这种情况下,创建一个反向索引:
from collections import defaultdict
values_to_keys = defaultdict(set)
for key, value in input_dict:
values_to_keys[value].add(key)
Run Code Online (Sandbox Code Playgroud)
现在你可以直接在O(1)(常数)时间内询问这组键:
keys = values_to_keys.get(value)
Run Code Online (Sandbox Code Playgroud)
这使用集合; 字典也没有排序,所以集合在这里更有意义.
修改你的功能:
def find_key_for(input_dict, value):
for k, v in input_dict.items():
if v == value:
yield k
Run Code Online (Sandbox Code Playgroud)
然后获得第一个密钥(或者None如果不存在)
print next(find_key_for(your_dict, 'b'), None)
Run Code Online (Sandbox Code Playgroud)
获得所有职位:
keys = list(find_key_for(your_dict, 'b'))
Run Code Online (Sandbox Code Playgroud)
或者,要获得'n'个键:
from itertools import islice
keys = list(islice(find_key_for(your_dict, 'b'), 5))
Run Code Online (Sandbox Code Playgroud)
注意 - 按照字典迭代的顺序,你得到的键将是'n'.
如果你经常这样做(并且你的价值是可以洗的),那么你可能希望改变你的词典
from collections import defaultdict
dd = defaultdict(list)
for k, v in d.items():
dd[v].append(k)
print dd['b']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16791 次 |
| 最近记录: |