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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:12:34