使用相同的键合并JSON元素

时间:2019-01-06 15:20:22

标签: python json

我一直在努力使用Python进行JSON转换。我有以下格式的JSON:

{
    "Children": [{ "child": "Child 0"}],
    "Parent": "Parent 10"
},
{
    "Children": [{ "child": "Child 1"}],
    "Parent": "Parent 10"
},
{
    "Children": [{ "child": "Child 2"}],
    "Parent": "Parent 11"
},

但我不想让父母重复,而是希望将孩子合并在一起以实现这一点:

{
    "Children": [{ "child": "Child 0"}, { "child": "Child 1"}],
    "Parent": "Parent 10"
},
{
    "Children": [{ "child": "Child 2"}],
    "Parent": "Parent 11"
},

2 个答案:

答案 0 :(得分:1)

看看itertools groupby函数。这是一个按父级对数据进行分组的示例。

>>> from itertools import groupby
>>> import pprint

>>> data = [{
    "Children": [{ "child": "Child 0"}],
    "Parent": "Parent 10"
},
{
    "Children": [{ "child": "Child 1"}],
    "Parent": "Parent 10"
},
{
    "Children": [{ "child": "Child 2"}],
    "Parent": "Parent 11"
}]

>>> data_grouped = {k: list(v) for k, v in groupby(data, key=lambda x: x["Parent"])}

>>> pp = pprint.PrettyPrinter(indent=4)
>>> pp.pprint(data_grouped)

{   'Parent 10': [   {   'Children': [{'child': 'Child 0'}],
                         'Parent': 'Parent 10'},
                     {   'Children': [{'child': 'Child 1'}],
                         'Parent': 'Parent 10'}],
    'Parent 11': [{'Children': [{'child': 'Child 2'}], 'Parent': 'Parent 11'}]}

在这里,我已将您的示例字典放在列表中,并按每个字典中的父项进行分组。所有这些都包裹在dict理解中,以提供有意义的输出。

答案 1 :(得分:1)

您也可以使用collections.defaultdict()来执行此操作,该操作可以在末尾序列化:

from collections import defaultdict
from json import dumps

data = [
    {"Children": [{"child": "Child 0"}], "Parent": "Parent 10"},
    {"Children": [{"child": "Child 1"}], "Parent": "Parent 10"},
    {"Children": [{"child": "Child 2"}], "Parent": "Parent 11"},
]

d = defaultdict(list)
for dic in data:
    parent, children = dic["Parent"], dic["Children"]
    d[parent].extend(children)

result = []
for k, v in d.items():
    result.append({"Parent": k, "Children": v})

print(dumps(result))

其中给出了JSON对象的JSON数组:

[{"Parent": "Parent 10", "Children": [{"child": "Child 0"}, {"child": "Child 1"}]}, {"Parent": "Parent 11", "Children": [{"child": "Child 2"}]}]

您还可以使用嵌套的defaultdict()通过父键将数据分组:

d = defaultdict(lambda : defaultdict(list))
for dic in data:
    parent, children = dic["Parent"], dic["Children"]
    d[parent]["Children"].extend(children)

print(dumps(d))

这给出了这个新结构:

{"Parent 10": {"Children": [{"child": "Child 0"}, {"child": "Child 1"}]}, "Parent 11": {"Children": [{"child": "Child 2"}]}}

并且将允许对父对象进行简单的O(1)查找。