带有许多词典列表的嵌套字典

时间:2017-01-24 11:24:40

标签: python dictionary

我使用这样的列表嵌套字典

    {
     'a': 1,
     'x':[
          {'b': 1,
           'c': [
             {'z': 12},
             {'z': 22},
            ]
          },
          {'b': 2,
           'c': [
              {'z': 10},
              {'z': 33},
            ]
          }
        ]
     }

我想把它转换成我喜欢的平面词典列表。

[
 {'a': 1, 'b': 1, 'z': 12},
 {'a': 1, 'b': 1, 'z': 22},
 {'a': 1, 'b': 2, 'z': 10},
 {'a': 1, 'b': 2, 'z': 33},
]

知道如何实现这个目标吗?

2 个答案:

答案 0 :(得分:0)

可能的解决方案是:

#!/usr/bin/env python3
d = {
    'a': 1,
    'x': [
        {
            'b': 1,
            'c': [
                {'z': 12}
            ]
        },
        {
            'b': 2,
            'c': [
                {'z': 10}
            ]
        }
    ]
}

res = [{"a": 1, "b": x["b"], "z": x["c"][0]["z"]} for x in d["x"]]
print(res)

这假设只有一个a(具有固定值1)和x元素,并且此元素会手动添加到comprehension

其他两个元素(bz)取自x数组,并带有列表推导。

  

要了解有关理解工作的更多信息,请阅读以下内容:

     

PS。你应该首先展示你到目前为止所尝试的内容并获得帮助。在发布下一个问题之前,请先查看SO rules

答案 1 :(得分:0)

以下内容产生了请求的结果:

[{'a': 1, 'b': 1, 'z': 12}, {'a': 1, 'b': 2, 'z': 10}]

使用风险自负。以下内容仅在您的示例中进行了测试。

from itertools import product

def flatten(D):

    if not isinstance(D, dict): return D

    base = [(k, v) for k, v in D.items() if not isinstance(v, list)]
    lists = [[flatten(x) for x in v] for k, v in D.items() if isinstance(v, list)]

    l = []
    for p in product(*lists):
        r = dict(base)
        for a in p:
            for d in a:
                r.update(d)
        l.append(r)

    return l

以上测试。

d = {
     'a': 1,
     'x':[
          {'b': 1,
           'c': [
             {'z': 12}
            ]
          },
          {'b': 2,
           'c': [
              {'z': 10}
            ]
          }
        ]
     }

print flatten(d)