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

修复Python递归提取嵌套列表数字及索引路径的代码错误

嵌套列表数字元素索引路径提取问题修复

问题原因

  • 全局indices变量用于存储当前遍历的路径层级,递归进入子列表时追加了当前索引,但递归结束返回父层级时没有移除该索引,导致路径残留了已处理完成的子列表层级,最终生成的索引路径错误。
  • 代码中递归调用时函数名错误,写为了Fruits(elem),实际应该调用自身Numbers(elem)。

修复方案

仅需2处改动即可解决问题:

  1. 递归调用子列表结束后,新增indices.pop()语句,清除当前层级的路径残留
  2. 修正递归调用的函数名

修复后完整代码

indices = []
List_numbers = []
Address_numbers = []

def Numbers(T):
    for index, elem in enumerate(T):
        if isinstance(elem, int):
            List_numbers.append(elem)
            Address_numbers.append(indices + [index])

        if isinstance(elem, list):
            indices.append(index)
            Numbers(elem)
            indices.pop() # 递归返回后弹出当前层级索引,重置路径状态

# 测试调用
T = ['apple', [10, 5, ['orange']], 3]
Numbers(T)
print('List of numbers: ' + str(List_numbers))
print('Address of numbers: ' + str(Address_numbers))

输出结果

List of numbers: [10, 5, 3]
Address of numbers: [[1, 0], [1, 1], [2]]

优化方案(可选)

如果需要避免全局变量污染、支持多次独立调用,可以改用路径参数传递的写法,无需维护全局索引变量:

def Numbers(T, current_path=None):
    if current_path is None:
        current_path = []
    list_numbers = []
    address_numbers = []
    for index, elem in enumerate(T):
        if isinstance(elem, int):
            list_numbers.append(elem)
            address_numbers.append(current_path + [index])
        if isinstance(elem, list):
            sub_nums, sub_addrs = Numbers(elem, current_path + [index])
            list_numbers.extend(sub_nums)
            address_numbers.extend(sub_addrs)
    return list_numbers, address_numbers

# 调用测试
T = ['apple', [10, 5, ['orange']], 3]
list_num, addr_num = Numbers(T)
print('List of numbers:', list_num)
print('Address of numbers:', addr_num)

内容的提问来源于stack exchange,提问作者yoyo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 16:36:03