如何在含多层嵌套的混合类型列表中使用列表推导式展开元素?
解决混合嵌套列表的扁平化问题
你的代码存在几个关键问题:
- 每次遇到非列表元素时,都会重新生成
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
相关产品推荐
相关产品推荐

