2013-05-13 92 views
3

我的問題可能有點複雜,但事實上這是事實。我有一個嵌套的字典,看起來像這樣:檢查列表中的項目是否存在於字典中

dict_a = {'one': {'bird':2, 'tree':6, 'sky':1, 'TOTAL':9}, 
      'two': {'apple':3, 'sky':1, 'TOTAL':4}, 
      'three': {'tree':6, 'TOTAL':6}, 
      'four': {'nada':1, 'TOTAL':1}, 
      'five': {'orange':2, 'bird':3, 'TOTAL':5} 
      } 

和一個列表:

list1 = ['bird','tree'] 
newlist = [] 

我怎麼能檢查的項目在列表1無論是在dict_a的嵌套字典,並追加到newlist?輸出應該是這樣的:

newlist = ['one','three','five'] 

因爲鳥和樹碰巧在嵌套的一,三和五字典中。

我能想到的是:

for s,v in dict_a.items(): 
    for s1,v1 in v.items(): 
     for item in list1: 
      if item == s1: 
       newlist.append(s) 

回答

4

list1一組,並使用dictionary views和列表理解:

set1 = set(list1) 
newlist = [key for key, value in dict_a.iteritems() if value.viewkeys() & set1] 

在Python 3,使用value.keys()dict_a.items代替。

這將測試字典鍵與您正在查找的鍵集之間是否存在一組交集(有效操作)。

演示:

>>> dict_a = {'one': {'bird':2, 'tree':6, 'sky':1, 'TOTAL':9}, 
...   'two': {'apple':3, 'sky':1, 'TOTAL':4}, 
...   'three': {'tree':6, 'TOTAL':6}, 
...   'four': {'nada':1, 'TOTAL':1}, 
...   'five': {'orange':2, 'bird':3, 'TOTAL':5} 
...   } 
>>> set1 = {'bird','tree'} 
>>> [key for key, value in dict_a.iteritems() if value.viewkeys() & set1] 
['three', 'five', 'one'] 

注意,字典順序是任意的(取決於所用的和字典的插入和刪除歷史的按鍵),因此,輸出列表中的順序可以不同。從技術上講,你也可以直接使用你的列表(value.viewkeys() & list1作品),但是使它成爲一個集合,更清楚地表明你的意圖。

+0

@martinpieters不幸的是我得到這個錯誤ValueError:太多的值來解壓縮: – 2013-05-13 09:01:42

+1

@FynnMahoney:我在第一次修改時出錯了(忘記調用'dict_a.iteritems()'),所以我們僅僅遍歷了鍵,而不是鍵和值。對於那個很抱歉。 – 2013-05-13 09:02:29

+0

@martinpieters謝謝! – 2013-05-13 09:30:09

相關問題