Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python dict的递归迭代与修改_Python - Fatal编程技术网

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不完全有意义,所以我对您的意思有点猜测。