如何修改未知结构嵌套字典的嵌套键值
修改未知结构的嵌套字典值
需求说明
需要修改一个事先不知道确切结构的嵌套字典中的值,将所有原始值替换为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
相关产品推荐
相关产品推荐

