如何对列表中多字典按学生ID统计科目最新评分的总和?
如何对列表中多字典按学生ID统计科目最新评分的总和?
兄弟,我明白你的需求了——每个学生同一科目可能有多次评分,只算最后一次的,然后按学生ID加总所有科目的最新分对吧?先帮你把思路理清楚,再看看你现有代码的问题,最后给你可行的解决方案。
核心思路
要解决这个问题,关键是保留每个学生每个科目的最后一次评分,因为列表里后面出现的条目是更新的评分。我们可以用一个嵌套字典来存数据:外层字典的键是学生ID,值是另一个字典,用来存该学生每个科目的最新评分(后面的条目直接覆盖前面的旧评分),最后再对每个学生的所有科目评分求和就行。
完整代码实现
exams = [ {'ID': 'p2', 'subject': 'am1', 'value': '18'}, {'ID': 'p2', 'subject': 'in1', 'value': '30'}, {'ID': 'p2', 'subject': 'am1', 'value':'23'}, {'ID': 'p9', 'subject': 'am1', 'value': '30'}, {'ID': 'p9', 'subject': 'in2', 'value': '30'}, {'ID': 'p9', 'subject': 'dX4', 'value': '30'} ] # 第一步:存储每个学生每个科目的最新评分 student_latest_scores = {} for exam in exams: student_id = exam['ID'] subject = exam['subject'] # 把评分转成整数,方便后续求和 score = int(exam['value']) # 如果学生还没在字典里,先初始化一个空字典存他的科目评分 if student_id not in student_latest_scores: student_latest_scores[student_id] = {} # 直接覆盖旧评分,因为后面的条目是最新的 student_latest_scores[student_id][subject] = score # 第二步:计算每个学生的总分,整理成你要的格式 result = [] for student_id, subject_scores in student_latest_scores.items(): total_score = sum(subject_scores.values()) result.append([student_id, str(total_score)]) # 输出结果 print(result)
运行这段代码后,就能得到你想要的输出:
[['p2', '53'], ['p9', '90']]
聊聊你现有代码的问题
你原来的代码有几个关键问题:
- 键名不匹配:你定义的
req_key = 'student_id'和req_exam = 'exam_id',但原字典里的键是ID和subject,根本对应不上,所以exam.pop()会报错。 - 逻辑方向错了:你的代码试图把学生和科目分开累加,但这完全不符合“保留最后一次评分再求和”的需求,反而会把所有评分都加起来,还错误地关联了学生和科目的数据。
这样调整后应该就能解决你的问题啦,有疑问随时问!
备注:内容来源于stack exchange,提问作者Bhamin
相关产品推荐
相关产品推荐

