0
我有类型的字典字典:查找基于价值
d = {
"key1" : {"id" : 5},
"key2" : {"id" : 6},
}
什么是发现了一些(并不重要)本字典,它的价值有一个键的最Python的方式特定的键/值对?在我的例子,我想是这样的:
result = find_by_key(d, "id", 5) # should return "key1"
我有类型的字典字典:查找基于价值
d = {
"key1" : {"id" : 5},
"key2" : {"id" : 6},
}
什么是发现了一些(并不重要)本字典,它的价值有一个键的最Python的方式特定的键/值对?在我的例子,我想是这样的:
result = find_by_key(d, "id", 5) # should return "key1"
使用生成器表达式和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
取决于你的 “第一重点” 的定义。考虑到不排除你的“第一把钥匙”可能每次都会有所不同。 – 2014-08-27 14:32:41
在这里定义'第一';字典没有排序。 – 2014-08-27 14:32:44
你是对的,解决这个问题。 – Tzach 2014-08-27 14:33:16