根据价值查找dicts的词典

时间:2014-08-27 14:29:26

标签: python dictionary

我有一个dicts的词典:

d = {
    "key1" : {"id" : 5},
    "key2" : {"id" : 6},
}

在这个词典中找到一些(并不重要)关键词,它的价值是否具有特定的键/值对,这是什么最pythonic方式?在我的例子中,我想要像:

result = find_by_key(d, "id", 5) # should return "key1"

1 个答案:

答案 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