You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将包含非可迭代对象的嵌套列表展平为一维列表

含非可迭代对象的嵌套列表展平实现方案

你之前的两种写法报错原因很明确:

  • 普通列表推导式默认外层所有元素都是可迭代对象,碰到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:54:04