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

如何扁平化未知嵌套维度的多维列表?

如何扁平化未知嵌套维度的多维列表?

这个问题我可太熟了!平时处理复杂数据的时候经常碰到这种不知道嵌套几层的列表,给你分享几个实用的解决办法:

方法一:递归生成器(最直观易读)

这是我日常用得最多的方法,逻辑特别清晰——遍历每个元素,如果是列表就递归展开,不是的话直接返回:

def flatten(nested_list):
    for item in nested_list:
        if isinstance(item, list):
            # 用yield from直接把递归生成的元素传出来,写法更简洁
            yield from flatten(item)
        else:
            yield item

# 拿你的例子测试下
original_list = [
    [
        [1, 2, [3, 4]],
        [[5, 6], 7]
    ],
    [8, 9, [10]]
]
flattened_list = list(flatten(original_list))
print(flattened_list)  # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

生成器还有个内存友好的优势,就算处理超大列表,也不会一下子把所有元素都加载到内存里,用的时候再生成,性能拉满。

方法二:迭代式实现(解决递归深度限制)

如果你的列表嵌套得特别深(比如上千层那种极端情况),递归会触发Python的递归深度限制报错,这时候就得上迭代方法,用队列或者栈来处理:

from collections import deque

def flatten_iterative(nested_list):
    # 用deque实现队列,popleft的效率比普通列表高很多
    queue = deque(nested_list)
    while queue:
        item = queue.popleft()
        if isinstance(item, list):
            # 反转列表后用extendleft,保证原列表的元素顺序不变
            queue.extendleft(reversed(item))
        else:
            yield item

# 测试
flattened_list = list(flatten_iterative(original_list))
print(flattened_list)  # 输出正确的目标列表

这个方法完全靠循环处理,不管嵌套多深都不会栈溢出,专门对付极端嵌套的场景。

方法三:一行递归列表推导(简洁但可读性差)

如果追求代码极简,也可以用递归的列表推导式一行搞定,但代价是可读性下降,适合简单场景或者你自己能快速看懂的情况用:

def flatten(nested_list):
    return [x for sub in nested_list for x in (flatten(sub) if isinstance(sub, list) else [sub])]

# 测试
print(flatten(original_list))  # 同样输出目标一维列表

备注:内容来源于stack exchange,提问作者Kiffikiffe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:08:07