Python多维列表转一维:现有复杂代码的优化方案咨询
多维列表转一维列表的优化方案
你当前的递归实现引入了大量状态变量(INDEXES、old_arr、depth等),逻辑绕且可读性差,下面给你几种简洁高效的优化实现:
方法一:递归生成器(最简洁易读)
生成器天然适配这种嵌套遍历场景,无需维护额外状态,逻辑清晰:
def flatten(arr): for item in arr: if isinstance(item, list): yield from flatten(item) else: yield item # 测试示例 a = [[1,2,8,6,[5,2,[452,258],1]],52,3,9,[52,1,2,[52,[12,52],5],90,8],8] print(list(flatten(a))) # 输出: [1, 2, 8, 6, 5, 2, 452, 258, 1, 52, 3, 9, 52, 1, 2, 52, 12, 52, 5, 90, 8, 8]
这种方式支持惰性求值,若不需要一次性生成完整列表,可逐个获取元素以节省内存;需要列表时用list()转换即可。
方法二:迭代式实现(规避递归深度限制)
如果你的多维列表嵌套极深,递归可能触发RecursionError,迭代法更安全:
def flatten(arr): stack = arr.copy() result = [] while stack: item = stack.pop() if isinstance(item, list): stack.extend(item) else: result.append(item) # 因pop从末尾取元素,最后需反转恢复顺序 return result[::-1] # 测试示例 a = [[1,2,8,6,[5,2,[452,258],1]],52,3,9,[52,1,2,[52,[12,52],5],90,8],8] print(flatten(a)) # 输出与原代码一致
用栈模拟递归过程,不受Python递归深度限制,适合处理超深嵌套列表。
方法三:简洁递归列表推导式
若偏好递归风格,可改用列表推导式压缩代码:
def flatten(arr): return [item for sublist in arr for item in (flatten(sublist) if isinstance(sublist, list) else [sublist])] # 测试示例 a = [[1,2,8,6,[5,2,[452,258],1]],52,3,9,[52,1,2,[52,[12,52],5],90,8],8] print(flatten(a)) # 输出与原代码一致
核心逻辑一行搞定,可读性较好,但仍存在递归深度限制问题。
优化后的优势
- 移除冗余状态变量,逻辑直观易懂
- 代码量大幅精简,维护成本降低
- 生成器和迭代法在内存利用上更高效,尤其适合处理大型列表
内容的提问来源于stack exchange,提问作者RokweMICHAEL
相关产品推荐
相关产品推荐

