itertools.chain适用于两层嵌套列表展平,轻量直观、不递归、跳过空子列表;但遇字符串会误拆为字符;深层嵌套需递归判断类型并排除字符串;numpy数组应优先用flatten()或ravel();sum(lst, [])性能差且类型受限。

用 itertools.chain 快速展平两层嵌套列表
如果列表只有两层(比如 [[1, 2], [3, 4], [5]]),itertools.chain 是最轻量、最直观的选择。它不递归,不碰深层嵌套,也不修改原数据。
- 直接解包传入:
list(itertools.chain(*nested_list)) - 遇到空子列表不会报错,自动跳过
- 比列表推导式稍快,尤其在子列表较多时
- 注意:如果某一层是字符串(比如
[['a', 'b'], ['c']]),chain会把字符串当可迭代对象拆成字符,结果变成['a', 'b', 'c']—— 这通常不是你想要的
用递归函数处理任意深度嵌套
真正“多维”往往意味着三层以上,甚至混有元组、集合等可迭代对象。这时必须写判断逻辑,不能靠简单解包。
- 核心是检查每个元素是否为
list或tuple(按需扩展)再决定是否递归 - 避免对字符串递归:必须加
isinstance(item, (str, bytes))排除,否则'abc'会被拆成['a','b','c'] - 示例函数:
def flatten(lst): result = [] for item in lst: if isinstance(item, (list, tuple)) and not isinstance(item, (str, bytes)): result.extend(flatten(item)) else: result.append(item) return result - 不依赖第三方库,但递归深度大时可能触发
RecursionError
用 numpy.concatenate 展平 NumPy 数组
如果你的“多维列表”实际来自 NumPy(比如 np.array([[1,2],[3,4]])),别转回 Python 列表再处理 —— 直接用 numpy 原生方法。
-
arr.flatten()返回副本,arr.ravel()尽量返回视图(更省内存) - 两者都支持
order参数:order='C'(行优先)、order='F'(列优先) - 若原始数据是不规则嵌套(如
[array([1]), array([2,3])]),先用np.concatenate拼接再展平,否则报ValueError: zero-dimensional arrays cannot be concatenated - 纯 Python 列表调用这些方法会报
AttributeError: 'list' object has no attribute 'flatten',得先转np.array
为什么不用 sum(lst, [])?
这个写法看似简洁,但隐患明显,线上代码里尽量避开。
- 本质是反复调用
+操作,时间复杂度 O(n²),列表一多就慢得明显 - 只适用于两层且所有子项都是
list;遇到tuple或array直接报TypeError: can only concatenate list (not "tuple") to list - 如果子列表里有非序列类型(比如
None),运行时报错位置难定位 - Python 3.12+ 对这种用法已有性能警告,未来可能限制
展平看似简单,但嵌套结构、数据类型、性能边界和错误信号常常交织在一起。动手前先确认:到底几层?有没有非 list/tuple 元素?后续还要不要保留原始结构?这几个问题没想清,选哪个方法都会踩坑。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











