检查列表中的项目是否存在于字典中。

6

我的问题可能有点复杂,但实际上是这样的。我有一个嵌套字典,看起来像这样:

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 = []

如何检查列表list1中的项是否在嵌套字典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)
1个回答

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有效),但将其制作为集合可以更清楚地表达您的意图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接