2017-08-12 62 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()]