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

如何在含多层嵌套的混合类型列表中使用列表推导式展开元素?

解决混合嵌套列表的扁平化问题

你的代码存在几个关键问题:

  • 每次遇到非列表元素时,都会重新生成unpacked,直接把所有第一层元素(包括未展开的嵌套列表)全部加入,导致最终结果里保留了未处理的[1000101],还重复添加了解包后的元素。
  • 仅处理了一层嵌套,遇到更深层级的列表会失效。
  • append(*b)用法错误,append只能接受单个参数,解包后传递多个参数会报错,正确应该用extend(b),但这也只能处理当前层的嵌套。

要实现任意深度的混合嵌套列表扁平化,结合列表推导式的话,最简洁的方式是用递归生成器配合列表推导式,或者直接写递归的列表推导逻辑:

方法1:递归生成器 + 列表推导式

先写一个递归生成器遍历所有非列表元素,再用列表推导式收集结果:

def flatten(lst):
    for item in lst:
        if isinstance(item, list):
            yield from flatten(item)
        else:
            yield item

list1 = [ [1,2,3], [10,11,12], [100,111,112], [1, 10, 11, [1000101]]]
unpacked = [x for x in flatten(list1)]
print(unpacked)
# 输出:[1, 2, 3, 10, 11, 12, 100, 111, 112, 1, 10, 11, 1000101]

方法2:纯递归列表推导式

如果想完全用列表推导式实现(不需要单独的生成器函数),可以写递归推导逻辑:

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

list1 = [ [1,2,3], [10,11,12], [100,111,112], [1, 10, 11, [1000101]]]
print(flatten(list1))
# 输出:[1, 2, 3, 10, 11, 12, 100, 111, 112, 1, 10, 11, 1000101]

说明

  • 两种方法都能处理任意深度的嵌套列表,比如[1, [2, [3, [4]]]]这种多层嵌套也能正确展开。
  • 用isinstance(item, list)代替type(item) == list更严谨,因为如果是继承自list的子类,type判断会失效,isinstance能正确识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:10:37