如何在Python中高效合并多层嵌套列表为一维列表?
部分嵌套列表的扁平化实现
你用sum()失败是因为sum(list, [])只能合并顶层的列表元素,对于嵌套更深的子列表(比如你示例中的[[a,b,c]]),它会把整个子列表当作单个元素直接加入结果,最终得到[[a,b,c],e,f,g,h,i,j],达不到完全扁平化的效果。
下面是几种高效的实现方式:
1. 递归展开(简洁直观)
适合嵌套深度不太大的场景,代码逻辑清晰:
def flatten(lst): merged = [] for item in lst: # 判断当前元素是否为列表,是则递归展开,否则直接添加 if isinstance(item, list): merged.extend(flatten(item)) else: merged.append(item) return merged # 测试示例 original_list = [[['a','b','c'], 'e', 'f', 'g'], 'h', 'i', 'j'] merged_list = flatten(original_list) print(merged_list) # 输出: ['a', 'b', 'c', 'e', 'f', 'g', 'h', 'i', 'j']
2. 迭代式展开(避免递归深度限制)
如果你的列表嵌套极深,递归可能触发RecursionError,用栈实现的迭代方法更稳妥:
def flatten_iterative(lst): stack = list(lst) merged = [] while stack: item = stack.pop() if isinstance(item, list): # 把列表元素重新压入栈,继续处理 stack.extend(item) else: merged.append(item) # 因为pop是从栈尾取元素,结果顺序会反转,最后要倒回来 return merged[::-1] # 测试示例 original_list = [[['a','b','c'], 'e', 'f', 'g'], 'h', 'i', 'j'] merged_list = flatten_iterative(original_list) print(merged_list)
3. 生成器实现(内存友好)
如果处理的是超大列表,生成器可以逐个产生元素,避免一次性占用大量内存:
def flatten_generator(lst): for item in lst: if isinstance(item, list): # 用yield from递归生成展开后的元素 yield from flatten_generator(item) else: yield item # 测试示例 original_list = [[['a','b','c'], 'e', 'f', 'g'], 'h', 'i', 'j'] merged_list = list(flatten_generator(original_list)) print(merged_list)
补充说明
如果你的元素中包含字符串、元组等其他可迭代对象,需要调整判断条件(比如排除字符串:isinstance(item, list) or (hasattr(item, '__iter__') and not isinstance(item, (str, bytes)))),但从你的示例来看,当前的判断逻辑已经足够。
内容的提问来源于stack exchange,提问作者VicMoo
相关产品推荐
相关产品推荐

