如何按位置从多个等长列表生成连续相邻元素配对列表?
问题:多等长列表按位置生成连续相邻元素配对
给定多个长度相同的列表,需要按相同位置生成连续相邻元素的配对列表——每个位置的元素依次与下一个列表同位置元素配对(重复使用前一个值)。示例如下:
list_a = [1, 2, 3, 4, 5] list_b = [6, 7, 8, 9, 10] list_c = [11, 12, 13, 14, 15] list_d = [16, 17, 18, 19, 20] # 期望输出 [(1,6),(6,11),(11,16),(2,7),(7,12),(12,17), ...]
要求避免暴力循环,优先使用zip或itertools等工具实现。
解决方案
核心思路是先按位置打包所有列表的元素,再对每个位置的元素组生成相邻配对,最后合并结果:
方法1:纯内置函数实现(列表推导式)
list_a = [1, 2, 3, 4, 5] list_b = [6, 7, 8, 9, 10] list_c = [11, 12, 13, 14, 15] list_d = [16, 17, 18, 19, 20] # 生成结果 result = [pair for group in zip(list_a, list_b, list_c, list_d) for pair in zip(group, group[1:])] print(result)
方法2:itertools优化(适合大数据量)
如果列表元素较多,用itertools.chain可避免中间列表的内存开销:
import itertools list_a = [1, 2, 3, 4, 5] list_b = [6, 7, 8, 9, 10] list_c = [11, 12, 13, 14, 15] list_d = [16, 17, 18, 19, 20] # 按位置打包元素组 position_groups = zip(list_a, list_b, list_c, list_d) # 生成所有配对并合并 result = list(itertools.chain.from_iterable(zip(g, g[1:]) for g in position_groups)) print(result)
原理说明
- 按位置打包:
zip(list_a, list_b, list_c, list_d)会将所有列表同位置的元素组合成元组,例如第一个元组为(1,6,11,16),对应四个列表的第一个元素。 - 生成相邻配对:对每个位置元组
group,zip(group, group[1:])会将元组中相邻元素配对——group[1:]是去掉第一个元素的元组,两者zip后得到(1,6),(6,11),(11,16)这类连续配对。 - 合并结果:通过列表推导式或
itertools.chain.from_iterable将所有位置的配对合并为一个大列表。
内容的提问来源于stack exchange,提问作者Radie
相关产品推荐
相关产品推荐

