提取多维字典列表

时间:2014-03-05 11:58:23

标签: python list python-2.7 dictionary

我有一个像你这样的多维字典:

>>> 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]

任何想法?

1 个答案:

答案 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']