
本文介绍一种简洁可靠的递归方法,用于将任意深度、不规则嵌套的列表(如含多层子列表、混合原子值)一次性展平为一维列表,适用于未知嵌套层级的实际场景。
本文介绍一种简洁可靠的递归方法,用于将任意深度、不规则嵌套的列表(如含多层子列表、混合原子值)一次性展平为一维列表,适用于未知嵌套层级的实际场景。
在 Python 中处理嵌套结构时,常见需求是将形如 [[[1, 2], [3]], 4, [[5, [6, 7]], 8]] 的不规则多维列表彻底展平为 [1, 2, 3, 4, 5, 6, 7, 8]。由于嵌套深度和结构不可预知,传统 sum(lst, []) 或两层列表推导式(如 [x for sublist in lst for x in sublist])均会失效——它们仅适用于固定二维结构。
推荐使用生成器风格的递归函数,兼顾内存效率与代码简洁性:
def flatten(nested):
for item in nested:
if isinstance(item, list):
yield from flatten(item) # Python 3.3+ 推荐写法,等价于循环 yield
else:
yield item
# 示例数据
test = [
[
[1, 2, [3, 4]],
[[5, 6], 7]
],
[8, 9, [10]]
]
result = list(flatten(test))
print(result) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]✅ 优势说明:
- ✅ 通用性强:自动适配任意嵌套层级,支持列表中混杂数字、字符串、布尔值等非列表元素;
- ✅ 内存友好:使用
yield和yield from构建生成器,避免中间列表累积,适合处理大型嵌套结构; - ✅ 可读性高:逻辑直白——“遇到列表就递归展开,否则直接产出”。
⚠️ 注意事项:
- 若需兼容 Python yield from flatten(item) 替换为
for x in flatten(item): yield x; - 此实现仅识别
list类型。若需支持tuple、set等其他可迭代容器(且非字符串),可扩展判断条件:if isinstance(item, (list, tuple, set)) and not isinstance(item, str):
(注意:必须排除
str,否则字符串会被错误地逐字符展开); - 深度极深的嵌套可能触发递归限制(默认约 1000 层),生产环境如遇超深结构,建议改用栈模拟的迭代方案。
总结:面对不可预知的嵌套维度,递归生成器是最平衡、最 Pythonic 的解决方案——短短数行即可稳健应对真实世界中的复杂嵌套数据。

















