如何将包含非可迭代对象的嵌套列表展平为一维列表
含非可迭代对象的嵌套列表展平实现方案
你之前的两种写法报错原因很明确:
- 普通列表推导式默认外层所有元素都是可迭代对象,碰到int这类非可迭代的单个值就会触发类型错误
- numpy.concatenate要求输入的所有数组维度完全一致,混合了列表(1维)和单个数值(0维)的输入自然会报维度不匹配的错误
下面给出几种不同场景的实现方案:
方案1:通用递归实现(支持任意深度嵌套)
这个方案兼容性最强,不管嵌套多少层都可以正常展平,也支持非数值类型的元素:
from collections.abc import Iterable def flatten(nested_list): res = [] for item in nested_list: # 排除字符串/字节串,避免把这类可迭代的文本拆成单个字符 if isinstance(item, Iterable) and not isinstance(item, (str, bytes)): res.extend(flatten(item)) else: res.append(item) return res # 测试用例 lst = [[1, 2], 3] print(flatten(lst)) # 输出:[1, 2, 3] # 更深嵌套的测试用例:flatten([[1, [2, 3]], 4, [5, [6, [7]]]]) 也会输出 [1,2,3,4,5,6,7]
方案2:单层嵌套简化实现
如果你的使用场景确定只有一层嵌套,没有更深的层级,可以用更简洁的列表推导式实现,性能比递归更好:
lst = [[1, 2], 3] flat = [sub_item for item in lst for sub_item in (item if isinstance(item, list) else [item])] print(flat) # 输出:[1, 2, 3]
方案3:numpy实现(适合数值元素场景)
如果你已经安装了numpy,且列表内所有元素都是数值类型,可以用这个方案:
import numpy as np lst = [[1, 2], 3] # 用np.atleast_1d把所有元素统一转成1维数组,解决维度不匹配问题 flat = np.concatenate([np.atleast_1d(item) for item in lst]).tolist() print(flat) # 输出:[1, 2, 3]
内容的提问来源于stack exchange,提问作者ken
相关产品推荐
相关产品推荐

