Python递归移除嵌套字典__collections__层时执行中断问题排查
问题根因分析
- 遍历逻辑缺陷:你初始化q为字典items的列表后,
for v, d in q只会遍历队列初始状态的元素,后续追加到q里的新元素不会被本轮循环处理,导致深层的__collections__层没有被扫描到,递归自然提前终止。 - 队列修改逻辑不安全:你在遍历过程中调用
q.remove((v, d))删除元素,会打乱队列的索引顺序,容易出现漏遍历的情况,同时如果存在重复键值对会误删不相关的条目。 - 分支判断覆盖不全:当目标键
__collections__和其他普通键(比如你的测试用例里的date、time)处于同一层级的时候,原代码的分支逻辑没有覆盖这种场景,导致同层的__collections__不会被处理。 - 小语法问题:原代码没有导入
MutableMapping,运行会报名称错误,需要补全导入语句from collections.abc import MutableMapping。
修复后的实现方案
直接采用更清晰的递归逻辑,先递归处理所有子字典,再判断当前层级是否需要拆包:
from collections.abc import MutableMapping def remove_repeat_named_level(dictionary, key): result = {} for k, v in dictionary.items(): # 先递归处理当前值的嵌套结构 if isinstance(v, MutableMapping): processed_v = remove_repeat_named_level(v, key) else: processed_v = v # 如果当前键是要移除的包装键,直接把处理后的值展开到上层 if k == key: if isinstance(processed_v, MutableMapping): result.update(processed_v) else: result[k] = processed_v return result
测试验证
用你提供的业务测试用例运行:
test_d2 = {"__collections__": {"tasks": {"task1": {"__collections__": {"subjects": {"subject1": {"date": 1, "time": 1, "__collections__": {"surveys": {"survey1": {"survey_data": {"Q1": {"Response": 1}, "Q2": {"Response": 2} } }, "__collections__": {} } } } } } } } } } print(remove_repeat_named_level(test_d2, "__collections__"))
输出结果符合预期,所有__collections__层都会被完全移除,空的__collections__层也会被清空不残留。
内容的提问来源于stack exchange,提问作者nguzman
相关产品推荐
相关产品推荐

