我有一个像你这样的多维字典:
>>> pprint.pprint(mult_dict, width = -1)
{'lvl0': {0: {'lvl1': {0: {'lvl2': '123'},
1: {'lvl2': '456'}}},
1: {'lvl1': {0: {'lvl2': '789'},
1: {'lvl2': '444'}}}}}
我希望将其转换为如此列表:
['123', '456', '789', '444']
我可以使用for循环来完成它,但我宁愿使用python的list comprehensions在一行上完成它。我认为它会是这样的,但显然这不起作用:
[lvl2 for lvl2 in lvl1 for lvl1 in lvl0 for lvl0 in mult_dict]
任何想法?
答案 0 :(得分:2)
循环字典值:
[v for lvl0 in mult_dict.itervalues()
for lvl1 in lvl0.itervalues()
for lvl2 in lvl1.itervalues()
for lvl3 in lvl2.itervalues()
for v in lvl3.itervalues()]
当您使用常规for
循环嵌套时,请务必从左到右列出for
循环。
使用这种深层结构,也许最好使用递归生成器:
def flatten_dicts(d):
for v in d.itervalues():
try:
for n in flatten_dicts(v):
yield n
except AttributeError:
yield v
演示:
>>> mult_dict = {'lvl0': {0: {'lvl1': {0: {'lvl2': '123'},
... 1: {'lvl2': '456'}}},
... 1: {'lvl1': {0: {'lvl2': '789'},
... 1: {'lvl2': '444'}}}}}
>>> [v for lvl0 in mult_dict.itervalues()
... for lvl1 in lvl0.itervalues()
... for lvl2 in lvl1.itervalues()
... for lvl3 in lvl2.itervalues()
... for v in lvl3.itervalues()]
['123', '456', '789', '444']
>>> list(flatten_dicts(mult_dict))
['123', '456', '789', '444']