You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改未知结构嵌套字典的嵌套键值

修改未知结构的嵌套字典值

需求说明

需要修改一个事先不知道确切结构的嵌套字典中的值,将所有原始值替换为changed_前缀的新值。

示例输入字典

example_dict = {
    'key1': 'value1',
    'key2': {
        'key2a': 'value2a'
    },
    'key3': {
        'key3a': {
            'key3aa': 'value3aa',
            'key3ab': 'value3ab',
            'key3ac': 'value3ac'
        },
        'key3b': [
            'value3b1',
            'value3b2'
        ]
    },
}

期望输出字典

example_dict = {
    'key1': 'changed_value1',
    'key2': {
        'key2a': 'changed_value2a'
    },
    'key3': {
        'key3a': {
            'key3aa': 'changed_value3aa',
            'key3ab': 'changed_value3ab',
            'key3ac': 'changed_value3ac'
        },
        'key3b': [
            'changed_value3b1',
            'changed_value3b2'
        ]
    },
}

现有尝试

已通过递归遍历获取字典结构,代码如下:

def recursive(src, so_far=()):
    if isinstance(src, dict):
        for key, value in src.items():
            yield from recursive(value, so_far + (key,))
    elif isinstance(src, list):
        for item in src:
            yield from recursive(item, so_far)
    else:
        yield ' '.join(so_far + (src,))

for line in recursive(example_dict):
    print(line)

输出结果:

key1 value1
key2 key2a value2a
key3 key3a key3aa value3aa
key3 key3a key3ab value3ab
key3 key3a key3ac value3ac
key3 key3b value3b1
key3 key3b value3b2

已经明确字典结构,但不知道如何通过循环批量修改嵌套键对应的值,希望生成或执行类似以下的修改语句:

example_dict['key1'] = 'changed_value1'
example_dict['key2']['key2a'] = 'changed_value2a'
example_dict['key3']['key3a']['key3aa'] = 'changed_value3aa'
example_dict['key3']['key3a']['key3ab'] = 'changed_value3ab'
example_dict['key3']['key3a']['key3ac'] = 'changed_value3ac'
example_dict['key3']['key3b'] = ['changed_value3b1', 'changed_value3b2']

解决方案

方法一:直接递归修改原字典

无需生成额外语句,直接遍历并修改原结构中的值:

def modify_nested_structure(src):
    if isinstance(src, dict):
        for key, value in src.items():
            src[key] = modify_nested_structure(value)
        return src
    elif isinstance(src, list):
        return [modify_nested_structure(item) for item in src]
    else:
        # 将原始值替换为带changed_前缀的新值
        return f'changed_{src}'

# 执行修改
modify_nested_structure(example_dict)

执行后,example_dict会直接变为期望的结构。

方法二:生成指定的赋值语句

如果需要生成可直接执行的修改语句,修改递归函数记录路径并输出对应语句:

def generate_modify_statements(src, root_name='example_dict', path=()):
    if isinstance(src, dict):
        for key, value in src.items():
            yield from generate_modify_statements(value, root_name, path + (f"'{key}'",))
    elif isinstance(src, list):
        # 生成整个列表的替换语句
        list_elements = ', '.join(f"'changed_{item}'" for item in src)
        path_str = ''.join([f'[{p}]' for p in path])
        yield f"{root_name}{path_str} = [{list_elements}]"
    else:
        # 生成单个值的赋值语句
        path_str = ''.join([f'[{p}]' for p in path])
        yield f"{root_name}{path_str} = 'changed_{src}'"

# 生成并打印所有修改语句
for stmt in generate_modify_statements(example_dict):
    print(stmt)

输出结果:

example_dict['key1'] = 'changed_value1'
example_dict['key2']['key2a'] = 'changed_value2a'
example_dict['key3']['key3a']['key3aa'] = 'changed_value3aa'
example_dict['key3']['key3a']['key3ab'] = 'changed_value3ab'
example_dict['key3']['key3a']['key3ac'] = 'changed_value3ac'
example_dict['key3']['key3b'] = ['changed_value3b1', 'changed_value3b2']

这些语句可直接复制执行,完成字典值的修改。

内容的提问来源于stack exchange,提问作者molly_percs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:06:04