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

use*_*130 5 python dictionary

我想提取 2d 字典第二级中的所有键,但 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
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 5

你很接近了。您只需要重新排序循环:

all = [ele for ww in ['a', 'b'] for ele in adict[ww] ]
Run Code Online (Sandbox Code Playgroud)

要理解原因,请考虑如何编写普通for循环:

all = []
for ww in ['a', 'b']:
    for ele in adict[ww]:
        all.append(ele)
Run Code Online (Sandbox Code Playgroud)

请注意,循环的顺序保持不变。另外,我已经删除了.keys(),这是没有必要的,因为dict默认情况下 a 的迭代发生在键上。


你也可以像乔恩·克莱门茨一样很棒,这样做:

In [265]: set().union(*adict.values())
Out[265]: {'aa', 'aaa', 'bb', 'bbb', 'cc', 'ccc'}
Run Code Online (Sandbox Code Playgroud)

*adict.values()返回内部字典的列表,其键被解包然后添加到集合中。一些提示:

  1. 不保证顺序(即使在 python3.6 上)

  2. 重复项被删除

  • 注意:调用 `.keys()` 是不必要的,而且可能会很昂贵 (Py2)。另外:“set(itertools.chain.from_iterable(adict.values()))”也可以。 (3认同)