2016-02-05 83 views
2

我正在嘗試編寫一行代碼來從Python中的2級嵌套字典中提取鍵。從Python中的嵌套字典中提取鍵

這裏是我的數據樣本:

values = [(u'Andy', OrderedDict([(u'en', 102)])), (u'Ben', OrderedDict([(u'es', 1)])), (u'Jane', OrderedDict([(u'EN', 719), (u'en', 969)])), (u'Steve', OrderedDict([(u'fr', 1)])), (u'Susanne', OrderedDict([(u'nl', 2)]))] 

預期的結果將是:

[u'en', u'es', u'EN', u'fr', u'nl'] 

到目前爲止,我已經試過:

map(lambda x: x[1].keys(), values.items()) 
AttributeError: 'unicode' object has no attribute 'keys' 

reduce(lambda k, v: v.keys(), values.items()) 
AttributeError: 'tuple' object has no attribute 'keys' 

這需要一個單線程,因爲我在Jinja模板中插入代碼,因此我試圖使用lambda。雖然我對Python很陌生,也許我誤解了一些東西......?

+0

不結果需要維持秩序? – timgeb

+0

Hi @timgeb無需保存訂單。 – user2761030

回答

0

試試這個 -

In [10]: reduce(lambda x,y:x+y ,map(lambda x:x[1].keys(), values)) 
Out[10]: [u'en', u'es', u'EN', u'en', u'fr', u'nl'] 

map從字典讓所有的鑰匙。
reduce可以完成組合嵌套列表的結果。

如果您需要唯一值(破壞秩序),使用set -

In [11]: list(set(reduce(lambda x,y:x+y ,map(lambda x:x[1].keys(), values)))) 
Out[11]: [u'fr', u'en', u'nl', u'es', u'EN'] 
1

values不是一本字典,它是沒有items屬性的列表。這裏有一個解決方案與itertools.chain.from_iterable

>>> list(set(chain.from_iterable(x[1].keys() for x in values))) 
[u'fr', u'en', u'nl', u'es', u'EN'] 
0

另一種解決方案

list(set([y for x in values for y in x[1].keys()]))