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

如何在Python中将N维嵌套数组展平为一维数组?

Python3 扁平化任意层级嵌套列表的最优方案

需求:将包含任意N层嵌套的列表转换为一维数组,示例如下:
输入数组:

ND_array = [1, [2, 3], [4, [5, 6]], 7, [8, 9, [10, 11, 12, [13, [14, 15, 16], 17], 18], 19, 20], 21]

期望输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]

方案1:递归生成器(简洁高效,内存友好)

递归生成器是处理这类问题的常用方案,它不会一次性生成整个结果列表,而是按需产生元素,内存占用更低,适合处理大型嵌套数组:

def flatten(nested_list):
    for item in nested_list:
        if isinstance(item, list):
            yield from flatten(item)
        else:
            yield item

# 调用示例
result = list(flatten(ND_array))
print(result)
  • 原理:遍历输入列表的每个元素,若元素是列表则递归遍历该子列表,否则直接返回元素;yield from简化了递归生成器的调用逻辑。
  • 注意:如果嵌套深度超过Python默认的递归深度限制(默认是1000),会抛出RecursionError,此时建议用迭代方案。

方案2:迭代式实现(无递归深度限制,更稳定)

用栈模拟递归过程,完全避免递归深度问题,适合处理嵌套极深的场景:

def flatten_iterative(nested_list):
    stack = nested_list.copy()
    result = []
    while stack:
        item = stack.pop()
        if isinstance(item, list):
            stack.extend(item)
        else:
            result.append(item)
    # 栈是后进先出,最后反转结果得到正确顺序
    return result[::-1]

# 调用示例
result = flatten_iterative(ND_array)
print(result)
  • 原理:将初始列表放入栈中,循环弹出栈顶元素,若为列表则将其元素全部加入栈中,否则加入结果列表;由于栈的后进先出特性,最后需要反转结果得到正确顺序。
  • 优势:不受递归深度限制,极端嵌套场景下更可靠。

方案3:一行式实现(基于列表推导式,适合简单场景)

如果追求代码简洁,也可以用嵌套列表推导式的递归写法,但可读性稍差,且同样存在递归深度限制:

flatten = lambda lst: [x for sublist in lst for x in flatten(sublist)] if isinstance(lst, list) else [lst]

# 调用示例
result = flatten(ND_array)
print(result)

最优方案选择

  • 大多数场景下优先选择递归生成器,代码简洁且内存效率高;
  • 若处理的嵌套列表深度极大(超过1000层),则选择迭代式实现,避免栈溢出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:52:14