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

如何将任意深度嵌套的List展平为包含所有元素的单个List?

任意深度嵌套List展平实现

核心目标是忽略所有嵌套层级,按原有顺序提取全部基础元素,最终得到无嵌套的一维列表,示例输入输出如下:

  • 示例输入:l = [[["A", ["B"]], ["C", "D"]], [["E", "F"], ["A"]]]
  • 预期输出:["A", "B", "C", "D", "E", "F", "A"]

方法1:递归实现

逻辑最直观,遍历每个元素,遇到子列表就递归展平,遇到基础元素直接加入结果:

def flatten(nested):
    res = []
    for item in nested:
        if isinstance(item, list):
            res.extend(flatten(item))
        else:
            res.append(item)
    return res

# 测试用例
l = [[["A", ["B"]], ["C", "D"]], [["E", "F"], ["A"]]]
print(flatten(l))  # 输出 ['A', 'B', 'C', 'D', 'E', 'F', 'A']

注意:递归实现存在深度限制,如果嵌套层级超过Python默认递归深度(一般是1000层左右)会触发递归报错,适合嵌套层级不深的场景。

方法2:栈迭代实现

没有递归深度限制,适合超深嵌套的场景,核心是用栈缓存待处理的元素,逆序入栈保证输出顺序和原顺序一致:

def flatten_iter(nested):
    res = []
    stack = [nested]
    while stack:
        current = stack.pop()
        if isinstance(current, list):
            # 子列表逆序压栈,保证弹出时顺序和原遍历顺序一致
            for item in reversed(current):
                stack.append(item)
        else:
            res.append(current)
    return res

# 测试用例
l = [[["A", ["B"]], ["C", "D"]], [["E", "F"], ["A"]]]
print(flatten_iter(l))  # 输出 ['A', 'B', 'C', 'D', 'E', 'F', 'A']

扩展:兼容其他可迭代嵌套类型

如果嵌套结构里除了列表还有元组、集合这类可迭代对象,只需要调整类型判断逻辑即可,注意要排除字符串/字节类型,不然字符串会被拆成单个字符:

from collections.abc import Iterable

def flatten_any_iter(nested):
    res = []
    stack = [nested]
    while stack:
        current = stack.pop()
        # 判断是可迭代容器、且不是字符串/字节类型才做展平
        if isinstance(current, Iterable) and not isinstance(current, (str, bytes)):
            for item in reversed(list(current)):
                stack.append(item)
        else:
            res.append(current)
    return res

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:03:27