嵌套for循环的优化方案——递归实现
优化嵌套字典列表结构的元素提取(替代多层嵌套循环)
我有一个由嵌套字典(OrderedDict)和列表组成的数据结构(从XML解析而来),需要搜索并提取指定子元素。当前功能正常,但用了多层嵌套for循环,想找更优的实现方式。
现有代码
主程序代码
import xmltodict import helper import sys reload(sys) sys.setdefaultencoding('utf-8') with open('fav_all.xml') as in_xml: d = xmltodict.parse(in_xml) for k0, v0 in d.items(): for l1 in helper.type_checker(v0): for l2 in helper.type_checker(l1): for l3 in helper.type_checker(l2): for l4 in helper.type_checker(l3): for l5 in helper.type_checker(l4): for l6 in helper.type_checker(l5): for l7 in helper.type_checker(l6): for l8 in helper.type_checker(l7): for l9 in helper.type_checker(l8): print 'yield'
辅助函数type_checker
def type_checker(x): if isinstance(x, list): for i in x: if isinstance(i, OrderedDict): yield i elif isinstance(x, OrderedDict): for k, v in x.items(): if k in tag_list: if k == 'DESCRIPTION': print '{k}: {v}'.format(k=k, v=v) elif k == 'GISUNIT': process_unit(v) yield 'end' else: yield v
优化方案:递归遍历替代多层循环
用递归遍历可以适配任意深度的嵌套结构,代码更简洁易维护,无需固定循环层数。
优化后的递归实现
from collections import OrderedDict # 假设tag_list、process_unit为已定义的目标标签集合和处理函数 tag_list = ['DESCRIPTION', 'GISUNIT'] def recursive_traverse(element): # 处理列表类型,遍历每个元素继续递归 if isinstance(element, list): for item in element: recursive_traverse(item) # 处理OrderedDict类型,遍历键值对 elif isinstance(element, OrderedDict): for k, v in element.items(): if k in tag_list: if k == 'DESCRIPTION': print '{k}: {v}'.format(k=k, v=v) elif k == 'GISUNIT': process_unit(v) # 其他目标标签的值继续递归遍历 else: recursive_traverse(v) else: # 非目标标签的元素也继续递归,避免遗漏深层结构 recursive_traverse(v)
简化后的主程序
import xmltodict import sys reload(sys) sys.setdefaultencoding('utf-8') with open('fav_all.xml') as in_xml: d = xmltodict.parse(in_xml) # 遍历顶层字典的所有值,启动递归 for v in d.values(): recursive_traverse(v)
优化说明
- 自动适配任意嵌套深度,无需修改循环层数
- 逻辑统一:统一处理列表和OrderedDict,遇到目标标签执行对应操作,其余情况继续递归遍历
- 扩展性更强:后续嵌套结构变化时,无需修改核心遍历逻辑
- 原代码中的
yield 'end'可根据需求调整,例如遇到GISUNIT后需终止当前分支遍历,可在处理后直接返回
内容的提问来源于stack exchange,提问作者fallingdog
相关产品推荐
相关产品推荐

