Python2.7下多元组子列表按交替索引合并的实现方案求助
实现思路与Python2.7代码方案
我来帮你梳理这个问题的实现思路,完全基于Python2.7标准库来搞定:
核心思路拆解
- 对齐子列表元素:首先要把所有子列表按位置对齐,短的子列表在超出自身长度的位置用
None填充,这样我们能保证每个结果元组对应所有子列表的同一位置元素(或None)。 - 按规则拼接元组:根据子列表的数量
n,采用不同的拼接逻辑:- 当
n=2时,每个结果元组格式为(x1, y1, x2),第二个子列表只取x值(没有则补None) - 当
n>2时,每个结果元组按顺序拼接每个子列表元素的x和y,元素不存在则x和y都用None代替
- 当
具体代码实现
import itertools def merge_tuples(input_sublists): sublist_count = len(input_sublists) # 题目要求最小输入是2个子列表,这里加个异常判断避免非法输入 if sublist_count < 2: raise ValueError("Input must have at least 2 sublists") # 用itertools.izip_longest对齐所有子列表,缺省位置补None aligned_items = itertools.izip_longest(*input_sublists) merged_result = [] for position_items in aligned_items: current_tuple = [] for idx, item in enumerate(position_items): # 处理当前子列表在该位置的元素,不存在则x、y都为None x, y = item if item is not None else (None, None) if sublist_count == 2 and idx == 1: # 双列情况:第二个子列表只添加x值 current_tuple.append(x) else: # 多列情况:添加当前元素的x和y current_tuple.append(x) current_tuple.append(y) # 把列表转为元组,加入结果集 merged_result.append(tuple(current_tuple)) return merged_result
测试示例
双列输入测试
a = [[(15,1),(14,2),(13,3),(12,4),(11,5),(10,6),(9,7),(8,8),(7,9),(6,10),(5,11),(4,12),(3,13),(2,14),(1,15)], [(7,1),(6,2),(5,3),(4,4),(3,5),(2,6),(1,7)]] print(merge_tuples(a))
输出片段:
[(15, 1, 7), (14, 2, 6), (13, 3, 5), (12, 4, 4), (11, 5, 3), (10, 6, 2), (9, 7, 1), (8, 8, None), (7, 9, None), ..., (1, 15, None)]
三列输入测试
a = [[(7,1),(6,2),(5,3),(4,4),(3,5),(2,6),(1,7)], [(6,1),(5,2),(4,3),(3,4),(2,5),(1,6)], [(10,1),(9,2),(8,3),(7,4),(6,5),(5,6),(4,7),(3,8),(2,9),(1,10)]] print(merge_tuples(a))
输出片段:
[(7, 1, 6, 1, 10, 1), (6, 2, 5, 2, 9, 2), (5, 3, 4, 3, 8, 3), (4, 4, 3, 4, 7, 4), (3, 5, 2, 5, 6, 5), (2, 6, 1, 6, 5, 6), (1, 7, None, None, 4, 7), (None, None, None, None, 3, 8), ..., (None, None, None, None, 1, 10)]
关键细节说明
itertools.izip_longest是Python2.7里实现列表对齐的核心工具,它会自动将所有输入的子列表扩展到最长子列表的长度,缺省位置补None,完美适配题目中“子列表元组数量可不同”的要求,而且不需要硬编码任何长度上限。- 代码里对
n=2的特殊情况做了单独处理,严格遵循题目要求的输出格式;多列情况则统一拼接每个子元素的x和y,逻辑清晰易维护。
内容的提问来源于stack exchange,提问作者Integration
相关产品推荐
相关产品推荐

