Python从列表提取值构建指定键序嵌套字典 按学生维度分组归集成绩
实现方案
Python 3.7+ 默认字典为插入有序结构,无需额外排序即可匹配要求的键顺序,核心通过分组映射完成成绩归集。
实现逻辑
- 拆分每条原始字符串为基础信息、成绩两类字段
- 以
(first-name, last-name, class, roll-number)元组作为学生唯一标识,维护分组映射字典:- 首次识别到某学生时,按指定键顺序构造学生基础字典,初始化空
marks列表 - 后续匹配到同一学生的成绩记录时,按指定顺序构造成绩条目,追加到对应
marks列表
- 首次识别到某学生时,按指定键顺序构造学生基础字典,初始化空
- 最终提取分组字典的所有值,即为目标嵌套列表
可运行代码
input_strings = [ 'abc-bcd_10_01_physics_90_70_20', 'abc-bcd_10_01_chemistry_85_75_10', 'ac-bd_10_03_biology_60_50_10', 'ad-bcd_10_05_physics_70_50_20', 'ac-bd_10_03_physics_65_50_15' ] grouped = {} for s in input_strings: seg = s.split('_') # 提取基础字段 first_name, last_name = seg[0].split('-') class_val = seg[1] roll_num = int(seg[2]) # 提取成绩字段 subject = seg[3] total = int(seg[4]) theory = int(seg[5]) practical = int(seg[6]) # 构造学生唯一键 key = (first_name, last_name, class_val, roll_num) # 首次出现则初始化基础结构 if key not in grouped: grouped[key] = { 'first-name': first_name, 'last-name': last_name, 'class': class_val, 'roll-number': roll_num, 'marks': [] } # 追加成绩条目 grouped[key]['marks'].append({ 'subject': subject, 'total': total, 'theory': theory, 'practical': practical }) # 最终结果 output = list(grouped.values())
注意点
- 所有字典构造时严格按照示例的键顺序写入,完全匹配预期的键排列要求
- 学号、各类分数自动转为整数类型,和示例输出的类型保持一致
- 原始字符串的遍历顺序和示例输入一致时,最终输出的学生顺序也和示例完全匹配
内容的提问来源于stack exchange,提问作者Rinaz Belhaj
相关产品推荐
相关产品推荐

