gpt4 book ai didi

python - 如何使用子字符串格式化 JSON 项目 OrderedDic 转储 - PYTHON 3

转载 作者:行者123 更新时间:2023-12-01 08:10:48 25 4
gpt4 key购买 nike

我正在尝试转换一个看起来像这样的 Json 文件

{
# "item_1":"value_11",
# "item_2":"value_12",
# "item_3":"value_13",
# "item_4":["sub_value_14", "sub_value_15"],
# "item_5":{
# "sub_item_1":"sub_item_value_11",
# "sub_item_2":["sub_item_value_12", "sub_item_value_13"]
# }
# }

看起来像这样的东西:

 {
# "node_item_1":"value_11",
# "node_item_2":"value_12",
# "node_item_3":"value_13",
# "node_item_4_0":"sub_value_14",
# "node_item_4_1":"sub_value_15",
# "node_item_5_sub_item_1":"sub_item_value_11",
# "node_item_5_sub_item_2_0":"sub_item_value_12",
# "node_item_5_sub_item_2_0":"sub_item_value_13"
# }

我知道 Json 文件转换为 CSV 时无法保持其顺序。我正在考虑通过将 JSON 数据加载到 OrderedDic 对象中来解决问题(这会导致它们按照输入文档列出它们的顺序添加)。但是,我对使用 JSON 文件以及 OrderedDic 函数不熟悉。

将项目拆分为我使用的子组:

def reduce_item(key, value):
global reduced_item

#Reduction Condition 1
if type(value) is list:
i=0
for sub_item in value:
reduce_item(key+'_'+to_string(i), sub_item)
i=i+1

#Reduction Condition 2
elif type(value) is dict:
sub_keys = value.keys()
for sub_key in sub_keys:
reduce_item(key+'_'+to_string(sub_key), value[sub_key])

#Base Condition
else:
reduced_item[to_string(key)] = to_string(value)

但是我如何使用 orderDic 以及上面的代码来显示此输出:

{
# "node_item_1":"value_11",
# "node_item_2":"value_12",
# "node_item_3":"value_13",
# "node_item_4_0":"sub_value_14",
# "node_item_4_1":"sub_value_15",
# "node_item_5_sub_item_1":"sub_item_value_11",
# "node_item_5_sub_item_2_0":"sub_item_value_12",
# "node_item_5_sub_item_2_0":"sub_item_value_13"
# }

我也有下面的代码,但它不会根据上面的子字符串代码的条件将每个代码拆分为子组:

import json
from collections import OrderedDict
with open("/home/file/official.json", 'r') as fp:
metrics_types = json.load(fp, object_pairs_hook=OrderedDict)
print(metrics_types)

这表明:

enter image description here

有什么建议吗?

最佳答案

您可以使用一个函数来迭代给定的字典或列表项,并合并递归调用的字典输出中的键:

def flatten(d):
if not isinstance(d, (dict, list)):
return d
out = {}
for k, v in d.items() if isinstance(d, dict) else enumerate(d):
f = flatten(v)
if isinstance(f, dict):
out.update({'%s_%s' % (k, i): s for i, s in f.items()})
else:
out[k] = f
return out

因此给定:

d = {
"item_1":"value_11",
"item_2":"value_12",
"item_3":"value_13",
"item_4":["sub_value_14", "sub_value_15"],
"item_5":{
"sub_item_1":"sub_item_value_11",
"sub_item_2":["sub_item_value_12", "sub_item_value_13"]
}
}

展平(d)返回:

{'item_1': 'value_11',
'item_2': 'value_12',
'item_3': 'value_13',
'item_4_0': 'sub_value_14',
'item_4_1': 'sub_value_15',
'item_5_sub_item_1': 'sub_item_value_11',
'item_5_sub_item_2_0': 'sub_item_value_12',
'item_5_sub_item_2_1': 'sub_item_value_13'}

上面假设您使用的是 Python 3.7 或更高版本,其中字典键保证是有序的。如果您使用的是早期版本,则可以使用 OrderedDict 代替常规字典。

关于python - 如何使用子字符串格式化 JSON 项目 OrderedDic 转储 - PYTHON 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55264883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com