Python3如何通用遍历任意深度嵌套字典修改值并生成新字典
通用嵌套字典遍历与修改实现方案
核心思路
放弃固定层数的硬编码循环逻辑,采用递归方式逐节点遍历任意深度的嵌套结构,遍历过程中记录当前节点的层级路径,灵活匹配目标值并执行自定义修改,最终生成完全独立的全新修改后字典,不改动原输入对象。
递归处理的核心逻辑
- 遍历过程中自动识别当前节点的结构类型,支持字典、列表等常见嵌套容器,不需要提前预设层级数量
- 全程记录当前节点的父级键集合,用来判断该值是否属于指定的业务层级(比如需求中的Grade2层级)
- 对基础类型的值(数值、字符串等)执行预设的匹配判断,符合规则就返回修改后的值,不符合则返回原值
- 所有递归返回的结果都是新建的容器对象,不会保留原字典的引用,保证修改后的字典完全独立
原硬编码4层循环的局限性:只能适配完全固定的嵌套层数和结构,只要层级加深、或者某层插入了列表/其他容器类型,循环逻辑就会直接失效,甚至触发键不存在的错误。
可直接复用的代码实现
def traverse_and_modify(input_obj, parent_keys=None): # 初始化父级键集合,记录当前节点所处的层级路径 if parent_keys is None: parent_keys = set() # 处理字典结构:新建空字典逐键递归 if isinstance(input_obj, dict): new_dict = {} for key, value in input_obj.items(): # 将当前键加入路径集合,递归处理子值 updated_parent_keys = parent_keys.copy() updated_parent_keys.add(key) new_dict[key] = traverse_and_modify(value, updated_parent_keys) return new_dict # 处理列表结构:新建空列表逐元素递归 elif isinstance(input_obj, list): new_list = [] for item in input_obj: new_list.append(traverse_and_modify(item, parent_keys)) return new_list # 处理基础类型值:执行规则匹配和修改 else: # 自定义匹配规则:处于Grade2层级下、数值类型、值低于90 if 'Grade2' in parent_keys and isinstance(input_obj, (int, float)) and input_obj < 90: # 自定义修改规则:统一调整为90 return 90 # 不符合规则则返回原值 return input_obj
调用方式
直接传入原成绩表对象即可生成独立的修改后字典:
updated_markssheet = traverse_and_modify(markssheet)
灵活适配不同需求的调整方法
不需要改动核心遍历逻辑,只需要修改基础值判断部分的规则即可适配其他场景:
- 如果需要匹配指定学科的成绩,比如要修改所有低于90的数学成绩,只需将匹配规则的判断条件替换为
'Math' in parent_keys and isinstance(input_obj, (int, float)) and input_obj < 90 - 如果需要调整的目标不是所有Grade2的成绩,而是Grade2下3班的成绩,只需在匹配规则中增加对应班级的键判断即可
- 支持任意深度的嵌套结构,哪怕嵌套层级加深到10层以上,只要结构是字典/列表嵌套,都能正常遍历处理
内容的提问来源于stack exchange,提问作者Rafiq
相关产品推荐
相关产品推荐

