在Python中将JSON或字典数据格式化为部分扁平结构
sample_data = {
"instances": [
{
"a": "1987",
"b": "2001",
"art": {
"009": {
"art_id": "009",
"mm": {
"1002": {
"mm_code": "1002",
"node": {
"6625583": {
"node_id": "6625583",
"node_sc": "186",
"node_si": [
{
"measure": "S",
"chest": 29
},
{
"measure": "M",
"chest": 32
}
]
}
}
}
}
}
}
}
]
}
我们需要什么?
我有一些样本数据,我需要把 sample["instances"][0]
转换成以下格式。
sample_data = {
"instances": [
{
"a": "1987",
"b": "2001",
"art_id": "009",
"mm_code": "1002",
"node_id": "6625583",
"node_sc": "186",
"measure": "S",
"chest": 29
},
{
"a": "1987",
"b": "2001",
"art_id": "009",
"mm_code": "1002",
"node_id": "6625583",
"node_sc": "186",
"measure": "M",
"chest": 32
}
]
}
需求
- 需要一个耗时非常少的解决方案。
- 可能会有多个“art_id”或者“art”和“mm”的嵌套值。这意味着:
{ "instances":
[
{ "a": "1987", "b": "2001",
"art":
{
001:{--},
002:{--}
}
},
{ "a": "197", "b": "201",
"art":
{
001:{--},
002:{--}
}
},
]
}
这同样适用于 mm
和 nodes
。
我尝试过这个解决方案: imran的解决方案,但没能达到所需的格式。 谢谢大家的帮助!
1 个回答
0
这里有一个可能的解决方案,教你如何把这个字典变得简单扁平:
sample_data = {
"instances": [
{
"a": "1987",
"b": "2001",
"art": {
"009": {
"art_id": "009",
"mm": {
"1002": {
"mm_code": "1002",
"node": {
"6625583": {
"node_id": "6625583",
"node_sc": "186",
"node_si": [
{"measure": "S", "chest": 29},
{"measure": "M", "chest": 32},
],
}
},
}
},
}
},
}
]
}
def find_node_si(dct):
if "node_si" not in dct:
next_dct = next(v for v in dct.values() if isinstance(v, dict))
return find_node_si(next_dct)
else:
return dct["node_si"]
def return_all_key_values(dct):
keys = [(k, v) for k, v in dct.items() if not isinstance(v, (list, dict))]
next_dct = next((v for v in dct.values() if isinstance(v, dict)), None)
if next_dct:
return keys + return_all_key_values(next_dct)
else:
return keys
out = {"instances": []}
for i in sample_data["instances"]:
dct = return_all_key_values(i)
for node_si in find_node_si(i):
out["instances"].append(dict(dct + list(node_si.items())))
print(out)
输出结果是:
{
"instances": [
{
"a": "1987",
"b": "2001",
"art_id": "009",
"mm_code": "1002",
"node_id": "6625583",
"node_sc": "186",
"measure": "S",
"chest": 29,
},
{
"a": "1987",
"b": "2001",
"art_id": "009",
"mm_code": "1002",
"node_id": "6625583",
"node_sc": "186",
"measure": "M",
"chest": 32,
},
]
}