如何更简洁编写嵌套列表扁平化代码?求优化现有实现
更优雅的多层嵌套列表展平方案
嘿,我懂你那种看到一堆嵌套chain调用就头大的感觉——这代码确实太杂乱了,可读性和维护性都差。这里有几个更优雅的方案来处理这种多层嵌套列表的展平需求:
1. 递归生成器(通用方案,适配任意嵌套层数)
如果你的列表嵌套层数不固定,或者以后可能会变化,递归生成器是最灵活的选择,代码清晰且易维护:
from itertools import chain def flatten(nested_iterable): for item in nested_iterable: if isinstance(item, list): yield from flatten(item) else: yield item numberlist1 = [[[1,2]]] numberlist2 = [[[1,2]]] # 先合并两个列表,再展平 result = list(flatten(chain(numberlist1, numberlist2))) print(result) # 输出: [1, 2, 1, 2]
这个生成器会自动遍历每一层嵌套,遇到列表就继续递归展开,遇到非列表元素就直接返回,不管你的列表嵌套3层还是10层都能处理。
2. 分步调用chain.from_iterable(固定嵌套层数)
如果能确定嵌套层数是固定的(比如这里都是3层),可以把每一步的展平操作拆分开来,比嵌套写法可读性高很多:
from itertools import chain numberlist1 = [[[1,2]]] numberlist2 = [[[1,2]]] # 第一步:合并两个列表 combined = chain(numberlist1, numberlist2) # 第二步:展平第一层嵌套 level1_flat = chain.from_iterable(combined) # 第三步:展平第二层嵌套,得到最终结果 result = list(chain.from_iterable(level1_flat))
每一步都有明确的意义,即使过一段时间再看代码,也能立刻明白每一步在做什么,不会像原来的嵌套写法那样让人困惑。
3. 嵌套列表推导式(固定嵌套层数,无需导入模块)
如果不想依赖itertools模块,对于固定层数的嵌套,用嵌套列表推导式也能写出简洁易读的代码:
numberlist1 = [[[1,2]]] numberlist2 = [[[1,2]]] result = [num for sublist in chain(numberlist1, numberlist2) for subsublist in sublist for num in subsublist]
这种写法把每一层的遍历逻辑清晰地列出来,没有多余的嵌套调用,代码紧凑且直观。
内容的提问来源于stack exchange,提问作者DarkDrassher34
相关产品推荐
相关产品推荐

