如何在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
相关产品推荐
相关产品推荐

