2013-05-13 103 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

相关问题