如何扁平化未知嵌套维度的多维列表?
如何扁平化未知嵌套维度的多维列表?
这个问题我可太熟了!平时处理复杂数据的时候经常碰到这种不知道嵌套几层的列表,给你分享几个实用的解决办法:
方法一:递归生成器(最直观易读)
这是我日常用得最多的方法,逻辑特别清晰——遍历每个元素,如果是列表就递归展开,不是的话直接返回:
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
相关产品推荐
相关产品推荐

