2014-08-27 88 views
0

我有类型的字典字典:查找基于价值

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

什么是发现了一些(并不重要)本字典,它的价值有一个键的最Python的方式特定的键/值对?在我的例子,我想是这样的:

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

取决于你的 “第一重点” 的定义。考虑到不排除你的“第一把钥匙”可能每次都会有所不同。 – 2014-08-27 14:32:41

+0

在这里定义'第一';字典没有排序。 – 2014-08-27 14:32:44

+0

你是对的,解决这个问题。 – Tzach 2014-08-27 14:33:16

回答

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