
本文详解如何用单行列表推导式高效地将嵌套的二维列表(list of lists)展开为一维列表,替代传统的 for 循环 + extend() 操作,并说明其语法逻辑、适用边界与常见误区。
本文详解如何用单行列表推导式高效地将嵌套的二维列表(list of lists)展开为一维列表,替代传统的 for 循环 + extend() 操作,并说明其语法逻辑、适用边界与常见误区。
在 Python 数据处理中,经常需要将形如 [[1,2,3], [4,5], [6]] 的二维列表“压平”为 [1,2,3,4,5,6]。虽然可通过显式循环实现,但更简洁、Pythonic 的方式是使用嵌套式列表推导式(nested list comprehension)。
核心语法如下:
flat = [item for sublist in nested_list for item in sublist]
该语法等价于以下双重循环逻辑:
- 外层遍历 nested_list 中的每个子列表(记为 sublist);
- 内层遍历每个 sublist 中的每个元素(记为 item);
- 将每个 item 依次加入新列表。
以原始示例为例:
lst = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]
]
flat = [x for row in lst for x in row]
print(flat)
# 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
⚠️ 注意事项:
- 顺序不可颠倒:for sublist in lst 必须在前,for item in sublist 在后;若写成 [x for x in row for row in lst] 将触发 NameError(row 未定义)。
- 仅适用于严格二维结构:所有子元素必须为可迭代对象(如 list, tuple, str)。若存在 None、数字或字典等非迭代项,会引发 TypeError。
- 不递归展开深层嵌套:此方法仅展平一层(即 2D → 1D),对三维及以上列表(如 [[[1,2]], [[3]]])无效;如需通用扁平化,应使用 itertools.chain.from_iterable() 或递归函数。
- 性能对比:相比 sum(lst, []) 或 itertools.chain.from_iterable(lst),该推导式在可读性与执行效率间取得良好平衡,且无需导入额外模块。
✅ 推荐替代方案(进阶参考):
from itertools import chain flat = list(chain.from_iterable(lst)) # 更高效,尤其对大数据集 # 或 flat = sum(lst, []) # 简洁但时间复杂度为 O(n²),不推荐用于大列表
总结:掌握 for outer in outer_iter for inner in outer 这一嵌套推导式结构,是提升 Python 列表操作简洁性与表达力的关键技巧之一。它不仅语义清晰、执行高效,也体现了 Python “扁平优于嵌套”的设计哲学。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











