如何将任意深度嵌套的List展平为包含所有元素的单个List?
任意深度嵌套List展平实现
核心目标是忽略所有嵌套层级,按原有顺序提取全部基础元素,最终得到无嵌套的一维列表,示例输入输出如下:
- 示例输入:
l = [[["A", ["B"]], ["C", "D"]], [["E", "F"], ["A"]]] - 预期输出:
["A", "B", "C", "D", "E", "F", "A"]
方法1:递归实现
逻辑最直观,遍历每个元素,遇到子列表就递归展平,遇到基础元素直接加入结果:
def flatten(nested): res = [] for item in nested: if isinstance(item, list): res.extend(flatten(item)) else: res.append(item) return res # 测试用例 l = [[["A", ["B"]], ["C", "D"]], [["E", "F"], ["A"]]] print(flatten(l)) # 输出 ['A', 'B', 'C', 'D', 'E', 'F', 'A']
注意:递归实现存在深度限制,如果嵌套层级超过Python默认递归深度(一般是1000层左右)会触发递归报错,适合嵌套层级不深的场景。
方法2:栈迭代实现
没有递归深度限制,适合超深嵌套的场景,核心是用栈缓存待处理的元素,逆序入栈保证输出顺序和原顺序一致:
def flatten_iter(nested): res = [] stack = [nested] while stack: current = stack.pop() if isinstance(current, list): # 子列表逆序压栈,保证弹出时顺序和原遍历顺序一致 for item in reversed(current): stack.append(item) else: res.append(current) return res # 测试用例 l = [[["A", ["B"]], ["C", "D"]], [["E", "F"], ["A"]]] print(flatten_iter(l)) # 输出 ['A', 'B', 'C', 'D', 'E', 'F', 'A']
扩展:兼容其他可迭代嵌套类型
如果嵌套结构里除了列表还有元组、集合这类可迭代对象,只需要调整类型判断逻辑即可,注意要排除字符串/字节类型,不然字符串会被拆成单个字符:
from collections.abc import Iterable def flatten_any_iter(nested): res = [] stack = [nested] while stack: current = stack.pop() # 判断是可迭代容器、且不是字符串/字节类型才做展平 if isinstance(current, Iterable) and not isinstance(current, (str, bytes)): for item in reversed(list(current)): stack.append(item) else: res.append(current) return res
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

