Python dict的递归迭代与修改
我有一个像这样的Python dict的递归迭代与修改,python,Python,我有一个像这样的JSON文件: { "top_key1": { "bottom.key1": "one", "bottom.key2": "two" }, "top_key2": [ "bottom.key1": "one", "bottom.key2": "two", ] } 我需要存储
JSON
文件:
{
"top_key1": {
"bottom.key1": "one",
"bottom.key2": "two"
},
"top_key2": [
"bottom.key1": "one",
"bottom.key2": "two",
]
}
我需要存储在一个数据结构中,它不允许我存储一个带句点(
)的密钥。我如何遍历这个JSON
结构,以便用\uu
替换每个
事件?最终结果将是:
{
"top_key1": {
"bottom_key1": "one",
"bottom_key2": "two"
},
"top_key2": [
"bottom_key1": "one",
"bottom_key2": "two",
]
}
JSON
文件可以嵌套多次(未知),并且值上也可以有
,但我不希望它们被\uu
替换。此外,“top_key2”的值是一个列表,应该保留它。我认为不太难,只需使用isinstance
检查当前值是否是另一个dict:
nested_dict = {
"top_key1": {
"bottom.key1": "one",
"bottom.key2": "two"
},
"top_key2": {
"bottom.key1": "one",
"bottom.key2": "two",
}
}
def replace_dots(nested_dict):
result_dict = {}
for key, val in nested_dict.items():
key = key.replace('.', '_')
if isinstance(val, dict):
result_dict[key] = replace_dots(val)
else:
result_dict[key] = val
return result_dict
fixed = replace_dots(nested_dict)
fixed
Out[4]:
{'top_key1': {'bottom_key1': 'one', 'bottom_key2': 'two'},
'top_key2': {'bottom_key1': 'one', 'bottom_key2': 'two'}}
我不确定我是否完全理解您的编辑,例如您的示例列表
仍然有一个关键的价值结构,但增加了一个额外的案例来处理
使用列表非常简单:
nested_dict2 = {
"top_key1": {
"bottom.key1": "one",
"bottom.key2": "two"
},
"top_key2": ["list.item1", "list.item2"]
}
def replace_dots(nested_dict):
result_dict = {}
for key, val in nested_dict.items():
key = key.replace('.', '_')
if isinstance(val, dict):
result_dict[key] = replace_dots(val)
elif isinstance(val, list):
cleaned_val = [v.replace('.', '_') for v in val]
result_dict[key] = cleaned_val
else:
result_dict[key] = val
return result_dict
replace_dots(nested_dict2)
Out[7]:
{'top_key1': {'bottom_key1': 'one', 'bottom_key2': 'two'},
'top_key2': ['list_item1', 'list_item2']}
看看这个:这就是最终帮助我的答案。谢谢谢谢马吕斯。JSON对象上也有列表和带句点的键,因此此方法缺少特定的用例。@李科纳:请看我的编辑,您可以添加额外的类型检查来处理列表,尽管您问题中的示例列表对我来说作为JSON不完全有意义,所以我对您的意思有点猜测。