检查列表中的项目是否存在于字典中
问题描述:
我的问题可能有点复杂,但事实上这是事实。我有一个嵌套的字典,看起来像这样:检查列表中的项目是否存在于字典中
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)
答
让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
作品),但是使它成为一个集合,更清楚地表明你的意图。
@martinpieters不幸的是我得到这个错误ValueError:太多的值来解压缩: – 2013-05-13 09:01:42
@FynnMahoney:我在第一次修改时出错了(忘记调用'dict_a.iteritems()'),所以我们仅仅遍历了键,而不是键和值。对于那个很抱歉。 – 2013-05-13 09:02:29
@martinpieters谢谢! – 2013-05-13 09:30:09