根据价值查找dicts的词典

Tza*_*ach 0 python dictionary

我有一个dicts的词典:

d = {
    "key1" : {"id" : 5},
    "key2" : {"id" : 6},
}
Run Code Online (Sandbox Code Playgroud)

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

result = find_by_key(d, "id", 5) # should return "key1"
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

使用生成器表达式和next()函数:

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
Run Code Online (Sandbox Code Playgroud)

KeyError如果找不到匹配的字典,我假设你想要一个.

生成器表达式对具有键值对的值的字典进行过滤,这由对字典项视图的成员资格测试确定.

这样做可以找到匹配键的最小工作量.

变化:

  • 在Python 3 dict.items()中已经是一个视图,并且iteritems()已被抛弃,因此请dict.items()改为使用:

    return next(k for k, v in d.items() if (key, value) in v.items())
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果要返回默认值而不是引发键错误,可以将其next()返回:

    def find_by_key(d, key, value):
        return next(
            (k for k, v in d.iteritems() if (key, value) in v.viewitems()),
            None)
    
    Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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
Run Code Online (Sandbox Code Playgroud)