我有一个dicts的词典:
d = {
"key1" : {"id" : 5},
"key2" : {"id" : 6},
}
在这个词典中找到一些(并不重要)关键词,它的价值是否具有特定的键/值对,这是什么最pythonic方式?在我的例子中,我想要像:
result = find_by_key(d, "id", 5) # should return "key1"
答案 0 :(得分:5)
使用生成器表达式和next()
function:
def find_by_key(d, key, value):
try:
return next(k for k, v in d.iteritems() if (key, value) in v.viewitems())
except StopIteration:
raise KeyError
如果找不到匹配的字典,我假设您想要KeyError
。
生成器表达式对具有键值对的值的字典进行过滤,这由对dictionary items view的成员资格测试确定。
这可以找到匹配键的最小工作量。
变体:
在Python 3 dict.items()
已经是一个视图,而iteritems()
已经被删除,因此请改用dict.items()
:
return next(k for k, v in d.items() if (key, value) in v.items())
如果您想要返回默认值而不是引发键错误,可以让next()
返回它:
def find_by_key(d, key, value):
return next(
(k for k, v in d.iteritems() if (key, value) in v.viewitems()),
None)
演示:
>>> def find_by_key(d, key, value):
... try:
... return next(k for k, v in d.iteritems() if (key, value) in v.viewitems())
... except StopIteration:
... raise KeyError
...
>>> d = {
... "key1" : {"id" : 5},
... "key2" : {"id" : 6},
... }
>>> find_by_key(d, "id", 5)
'key1'
>>> find_by_key(d, "id", 6)
'key2'
>>> find_by_key(d, "id", 7)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in find_by_key
KeyError