2017-08-12 33 views
2

我想提取第二级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 

回答

3

你靠近。你只需要重新整理您的循环:

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上的迭代发生在密钥上。


You can also be awesome like Jon Clements和做到这一点:

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

*adict.values()返回内词典,它的键是解压,然后再加入一组的列表。一些指针:

  1. 订单不能保证(甚至在python3.6)

  2. 重复被丢弃

+0

像'()设置联盟(* adict.values。 ())'也可能是合适的......(它将提取所有的键作为一个集合而不是一个列表 - 如果你不想指定确切的键并且不想重复的话,这可能是有用的) –

+3

注意:调用'.keys()'是不必要的,可以很贵(Py2)。另外:'set(itertools.chain.from_iterable(adict.values()))'也可以。 – AChampion

0
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()]