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

嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:14:59