You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对列表中多字典按学生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']]

聊聊你现有代码的问题

你原来的代码有几个关键问题:

  1. 键名不匹配:你定义的req_key = 'student_id'和req_exam = 'exam_id',但原字典里的键是ID和subject,根本对应不上,所以exam.pop()会报错。
  2. 逻辑方向错了:你的代码试图把学生和科目分开累加,但这完全不符合“保留最后一次评分再求和”的需求,反而会把所有评分都加起来,还错误地关联了学生和科目的数据。

这样调整后应该就能解决你的问题啦,有疑问随时问!

备注:内容来源于stack exchange,提问作者Bhamin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 10:13:09