2014-08-27 155 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