我一直在努力使用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"
},
答案 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)查找。