修复Python递归提取嵌套列表数字及索引路径的代码错误
嵌套列表数字元素索引路径提取问题修复
问题原因
- 全局
indices变量用于存储当前遍历的路径层级,递归进入子列表时追加了当前索引,但递归结束返回父层级时没有移除该索引,导致路径残留了已处理完成的子列表层级,最终生成的索引路径错误。 - 代码中递归调用时函数名错误,写为了
Fruits(elem),实际应该调用自身Numbers(elem)。
修复方案
仅需2处改动即可解决问题:
- 递归调用子列表结束后,新增
indices.pop()语句,清除当前层级的路径残留 - 修正递归调用的函数名
修复后完整代码
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
相关产品推荐
相关产品推荐

