本文详解如何用单行列表推导式高效地将嵌套的二维列表(list of lists)展平为一维列表,避免显式循环,同时说明语法结构、常见误区及适用边界。
本文详解如何用单行列表推导式高效地将嵌套的二维列表(list of lists)展平为一维列表,避免显式循环,同时说明语法结构、常见误区及适用边界。
在 Python 中,将形如 [[1,2,3], [4,5], [6]] 的二维列表转换为 [1,2,3,4,5,6] 这样的扁平化一维列表,是数据预处理中的高频操作。虽然可通过 for 循环配合 extend() 实现(如原问题中所示),但更简洁、Pythonic 的方式是使用嵌套列表推导式(nested list comprehension)。
其核心语法为:
flat = [item for sublist in nested_list for item in sublist]
该语法等价于以下双层循环逻辑:
flat = []
for sublist in nested_list:
for item in sublist:
flat.append(item)
以原题示例为例:
lst = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]
]
flat = [item for sublist in lst for item in sublist]
print(flat)
# 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
⚠️ 注意事项:
- 顺序不可颠倒:for sublist in lst 必须在前,for item in sublist 在后;若写成 [item for item in sublist for sublist in lst] 将报错(sublist 未定义)。
- 仅适用于严格二维结构:所有子列表必须为 list 类型且可迭代;若存在 None、标量或深层嵌套(如三维),需改用 itertools.chain 或递归方案。
- 性能对比:该推导式在内存与速度上通常优于 sum(lst, [])(后者因重复创建新列表而有 O(n²) 开销),也比 itertools.chain.from_iterable(lst) 略慢但更直观易读。
✅ 推荐替代方案(进阶场景):
from itertools import chain flat = list(chain.from_iterable(lst)) # 内存友好,适合超大嵌套列表
总结:掌握 [item for sublist in lst for item in sublist] 这一模式,是提升 Python 列表操作效率的关键技巧之一——它语义清晰、执行高效,且完全符合 Python 的表达哲学:简洁即力量,可读即正确。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











