Python处理学生答题日志 校验解题数量、题目及得分是否一致
代码实现
以下是符合Pythonic规范的可运行代码:
from collections import defaultdict logs = ["0001 3 95", "0001 5 90", "0001 5 100", "0002 3 95", "0001 7 80", "0001 8 80", "0001 10 90", "0002 10 90", "0002 7 80", "0002 8 80", "0002 5 100", "0003 99 90"] # 构造学生-题目得分映射,同一学生同题目多次提交默认取最后一次提交的得分 student_problem_scores = defaultdict(dict) for log in logs: stu_id, prob_id, score = log.split() student_problem_scores[stu_id][prob_id] = int(score) # 需求1:统计有效解题数,校验所有学生数量是否一致 valid_counts = {stu_id: len(prob_scores) for stu_id, prob_scores in student_problem_scores.items()} count_consistent = len(set(valid_counts.values())) == 1 print("各学生有效解题数:", valid_counts) print("所有学生有效解题数是否一致:", count_consistent) # 需求2:校验所有学生的题目ID、对应得分是否完全相同 # 排序后转元组是为了消除字典无序的影响,确保内容相同则结构相同 score_patterns = set(tuple(sorted(prob_scores.items())) for prob_scores in student_problem_scores.values()) score_consistent = len(score_patterns) == 1 print("所有学生的已解题目及对应得分是否完全相同:", score_consistent)
运行输出
各学生有效解题数: {'0001': 5, '0002': 5, '0003': 1} 所有学生有效解题数是否一致: False 所有学生的已解题目及对应得分是否完全相同: False
逻辑说明
- 用
defaultdict嵌套字典存储数据,天然处理同学生同题目重复提交的场景,重复提交时直接覆盖旧得分即可,符合有效解题的统计规则 - 校验数量一致时,将所有有效解题数转成集合,若集合长度为1则所有值相等
- 校验题目和得分一致时,先将每个学生的题目得分键值对排序后转成可哈希的元组,再转集合去重,集合长度为1则所有学生的题目得分完全一致
- 若业务要求同一学生同题目多次提交取最高分,只需将赋值逻辑改为
student_problem_scores[stu_id][prob_id] = max(int(score), student_problem_scores[stu_id].get(prob_id, 0))即可
内容的提问来源于stack exchange,提问作者T Nam
相关产品推荐
相关产品推荐

