Python实现:交替合并两个列表的子列表生成新列表
问题分析与解决方案
现有代码的核心问题
- 原列表被修改导致逻辑错误:代码直接在原始的
sublist1上执行插入操作,处理完list2的第一个子列表后,sublist1已经是合并后的状态,后续处理list2其他子列表时,无法再基于原始的sublist1做交替合并,这才出现了b元素被直接追加到末尾的错误。 insert操作性能极差:列表的insert是O(n)复杂度,频繁执行会让性能急剧下降,完全无法支撑百万级规模的子列表处理需求。
修正后的基础实现
先解决逻辑错误,确保输出符合预期:
from itertools import zip_longest def foo(array1, array2): result = [] for sub1 in array1: for sub2 in array2: merged = [] # 配对两个子列表的元素,sub1更长时保留剩余元素 for x, y in zip_longest(sub1, sub2): merged.append(x) if y is not None: merged.append(y) result.append(merged) return result
测试示例输入:
list1 = [['1', '1', '1', '1'], ['2', '2', '2', '2'], ['3', '3', '3', '3']] list2 = [['a', 'a', 'a'], ['b', 'b', 'b']] print(foo(list1, list2))
输出完全符合预期:
[['1', 'a', '1', 'a', '1', 'a', '1'], ['1', 'b', '1', 'b', '1', 'b', '1'], ['2', 'a', '2', 'a', '2', 'a', '2'], ['2', 'b', '2', 'b', '2', 'b', '2'], ['3', 'a', '3', 'a', '3', 'a', '3'], ['3', 'b', '3', 'b', '3', 'b', '3']]
百万级数据优化版本
针对大规模场景,进一步优化性能:
from itertools import zip_longest, chain def efficient_foo(array1, array2): result = [] # 预分配内存,避免动态扩容的性能损耗 result.reserve(len(array1) * len(array2)) for sub1 in array1: for sub2 in array2: # 用链式操作直接展平配对元素,减少中间列表开销 merged = list(chain.from_iterable( (x, y) if y is not None else (x,) for x, y in zip_longest(sub1, sub2) )) result.append(merged) return result
优化点说明:
chain.from_iterable直接展平配对后的元组,比逐个append的内存和时间开销更低result.reserve()提前分配足够内存,避免列表频繁扩容- 全程不修改输入的原始列表,保证每次合并都基于原始子列表,同时避免破坏输入数据
内容的提问来源于stack exchange,提问作者crxunch
相关产品推荐
相关产品推荐

