如何按规则合并两个Python列表?分组拼接元素需求
问题:合并两个Python列表为指定扁平结构
原始数据
现有两个Python列表:
sgrades_flat = ['Barrett', 'Edan', '70', '45', '59', 'Bradshaw', 'Reagan', '96', '97', '88', 'Charlton', 'Caius', '73', '94', '80', 'Mayo', 'Tyrese', '88', '61', '36', 'Stern', 'Brenda', '90', '86', '45'] s_grades = ['F', 'A', 'B', 'D', 'C']
预期目标
将两个列表合并为以下形式的扁平列表:
['Barrett', 'Edan', '70', '45', '59', 'F', 'Bradshaw', 'Reagan', '96', '97', '88', 'A', 'Charlton', 'Caius', '73', '94', '80', 'B', 'Mayo', 'Tyrese', '88', '61', '36', 'D', 'Stern', 'Brenda', '90', '86', '45', 'C']
原代码问题分析
你之前尝试的代码:
z=[] for i, x in zip(sgrades_flat[::5], s_grades): z.append(i+x) print(z)
输出结果不符合预期,问题出在:
sgrades_flat[::5]仅提取了每组的第一个元素(如Barrett、Bradshaw),而非整组5个元素i+x是字符串拼接操作,而非将列表元素追加到结果集合中
正确实现方法
方法1:切片分组+循环扩展
通过列表推导式将sgrades_flat按每5个元素分组,再与s_grades配对后合并:
result = [] # 按每5个元素切分原始列表,生成子列表组 groups = [sgrades_flat[i:i+5] for i in range(0, len(sgrades_flat), 5)] # 遍历每组和对应等级,扩展到结果列表 for group, grade in zip(groups, s_grades): result.extend(group) result.append(grade) print(result)
方法2:索引计算直接切片
通过索引计算直接定位每组的起始和结束位置,避免生成中间子列表:
result = [] for idx, grade in enumerate(s_grades): start = idx * 5 end = start + 5 # 追加当前组的所有元素和对应等级 result += sgrades_flat[start:end] result.append(grade) print(result)
方法3:使用itertools分组(适合大型列表)
借助itertools的分组工具处理,效率更高:
from itertools import zip_longest def grouper(iterable, n, fillvalue=None): args = [iter(iterable)] * n return zip_longest(*args, fillvalue=fillvalue) result = [] for group, grade in zip(grouper(sgrades_flat, 5), s_grades): result.extend(group) result.append(grade) print(result)
输出结果
以上三种方法均会输出符合预期的扁平列表:
['Barrett', 'Edan', '70', '45', '59', 'F', 'Bradshaw', 'Reagan', '96', '97', '88', 'A', 'Charlton', 'Caius', '73', '94', '80', 'B', 'Mayo', 'Tyrese', '88', '61', '36', 'D', 'Stern', 'Brenda', '90', '86', '45', 'C']
内容的提问来源于stack exchange,提问作者Surkles
相关产品推荐
相关产品推荐

