提取嵌套字典第二层中的所有键

5

我想提取二维字典中第二层的所有键,但Python解释器报错NameError。我的期望结果是['aa','bb','cc','aaa','bbb','ccc']。

>>> adict
defaultdict(<class 'dict'>, {'b': {'aaa': 444, 'ccc': 666, 'bbb': 555}, 'a': {'aa': 111, 'cc': 333, 'bb': 222}})

>>> all = [ele for ele in adict[ww].keys() for ww in ['a', 'b']]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ww' is not defined
2个回答

5

你已经接近成功了。你只需要重新排列循环:

all = [ele for ww in ['a', 'b'] for ele in adict[ww] ]

为了理解原因,想象一下您如何编写普通的 for 循环:
all = []
for ww in ['a', 'b']:
    for ele in adict[ww]:
        all.append(ele)

请注意循环的顺序保持不变。此外,我已经删除了 .keys(),因为默认情况下对 dict 进行迭代时会遍历键。
您还可以像Jon Clements一样非常棒地完成这个操作:
In [265]: set().union(*adict.values())
Out[265]: {'aa', 'aaa', 'bb', 'bbb', 'cc', 'ccc'}

*adict.values()返回一个内部字典列表,其键被解包并添加到集合中。一些指针:

  1. 顺序不保证(即使在python3.6上也是如此)

  2. 重复项被删除


1
类似于 set().union(*adict.values()) 这样的代码也许更适合...(它将所有键作为一个集合提取出来,而不是一个列表 - 如果您不想指定确切的键并且不想要重复项,这可能很有用) - Jon Clements
3
注意:调用.keys()是不必要的,而且可能很耗费资源(在Python 2中)。另外,set(itertools.chain.from_iterable(adict.values()))也可以起同样的作用。 - AChampion

2
adict = {'b': {'aaa': 444, 'ccc': 666, 'bbb': 555}, 'a': {'aa': 111, 'cc': 333, 'bb': 222}}

[key for nested_dict_key, nested_dict_value in adict.iteritems() for key, value in nested_dict_value.iteritems()]

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