Python嵌套列表交错合并(区别于flat zip):求更优雅实现方案
嵌套列表的交错合并优化实现
需求明确:把嵌套列表按「依次取出各子列表的第1个、第2个……元素」的规则交错合并,比如输入[['a','b','c'], ['d','e','f'], ['g','h','i','j','k']],要得到['a','d','g','b','e','h','c','f','i','j','k']。
下面给几个更优雅的实现方案:
方案1:用itertools.zip_longest一键搞定
这是最简洁的写法,借助标准库的zip_longest按位置打包所有子列表的元素,再扁平化处理,同时过滤掉填充的空值:
from itertools import zip_longest input_lists = [['a','b','c'], ['d','e','f'], ['g','h','i','j','k']] # 一行列表推导式搞定 output_list = [item for group in zip_longest(*input_lists) for item in group if item is not None] print(output_list) # 输出符合预期的结果
原理:zip_longest(*input_lists)会把每个子列表对应位置的元素打包成元组,短列表不够的位置用None补全。比如前三组是('a','d','g')、('b','e','h')、('c','f','i'),后面两组是(None, None, 'j')、(None, None, 'k')。我们只需要把这些元组里的非None元素依次取出来就行。
方案2:生成器版(内存友好)
如果要处理的嵌套列表特别大,用生成器可以避免一次性加载所有结果到内存里:
from itertools import zip_longest def interleave_flatten(nested_lists): for group in zip_longest(*nested_lists): # 逐个yield非空元素 yield from (item for item in group if item is not None) input_lists = [['a','b','c'], ['d','e','f'], ['g','h','i','j','k']] output_list = list(interleave_flatten(input_lists))
方案3:不依赖库的优化循环
如果不想用标准库,也可以优化你原来的循环逻辑,让代码更清晰,还不会修改原始输入列表:
input_lists = [['a','b','c'], ['d','e','f'], ['g','h','i','j','k']] output_list = [] # 复制原列表,避免修改输入数据 remaining = [lst.copy() for lst in input_lists] while remaining: current_batch = [] new_remaining = [] for lst in remaining: if lst: current_batch.append(lst.pop(0)) new_remaining.append(lst) output_list.extend(current_batch) remaining = new_remaining print(output_list)
这个版本把每一轮要取的元素单独收集,同时更新剩余的非空子列表,逻辑比原代码更直观,还保护了原始输入。
内容的提问来源于stack exchange,提问作者Omroth
相关产品推荐
相关产品推荐

