Python动态处理嵌套列表:学生成绩录入与数据组织问题
解决方案:用结构化数据组织学生成绩并实现平均分计算
你之前的代码把三类成绩分别存在独立列表里,导致学生和成绩的对应关系断裂,没法直接做平均分计算。下面用字典+列表的结构化方案来解决这个问题,既符合你想要的“嵌套”结构,又能轻松实现后续统计需求。
1. 优化数据结构:绑定学生与成绩
用字典列表来存储每个学生的完整信息,每个学生条目包含姓名和三次成绩记录,结构清晰且易于操作。最终数据结构示例:
[ {"name": "Patrick", "grades": [ {"discussion": 50, "quiz": 50, "assignment": 50}, {"discussion": 60, "quiz": 65, "assignment": 70}, {"discussion": 75, "quiz": 80, "assignment": 85} ]}, {"name": "Michael", "grades": [ {"discussion": 60, "quiz": 60, "assignment": 60}, # 另外两次成绩记录 ]} ]
2. 重写成绩录入代码
先补全学生姓名获取逻辑,再调整成绩录入循环,直接将成绩绑定到对应学生:
# 获取学生姓名列表 studentNumber = int(input("请输入学生人数:")) studentNameList = [] for _ in range(studentNumber): name = input("请输入学生姓名:").strip().title() studentNameList.append(name) # 初始化学生成绩存储结构 students = [] for name in studentNameList: students.append({"name": name, "grades": []}) # 录入三次成绩 for round_num in range(1, 4): print(f"\n===== 录入第 {round_num} 次成绩 =====") for student in students: while True: try: discussion = int(input(f"请输入{student['name']}的第{round_num}次讨论成绩:")) quiz = int(input(f"请输入{student['name']}的第{round_num}次测验成绩:")) assignment = int(input(f"请输入{student['name']}的第{round_num}次作业成绩:")) # 将本次成绩添加到该学生的成绩列表中 student["grades"].append({ "discussion": discussion, "quiz": quiz, "assignment": assignment }) break except ValueError: print("输入无效,请输入整数成绩!") # 验证存储结构 print("\n=== 学生成绩数据 ===") for student in students: print(f"{student['name']}: {student['grades']}")
3. 计算每位学生的平均分
基于结构化的数据,直接提取每个学生的各类成绩进行统计:
print("\n=== 学生成绩平均分 ===") for student in students: # 提取所有对应类型的成绩 discussion_scores = [grade["discussion"] for grade in student["grades"]] quiz_scores = [grade["quiz"] for grade in student["grades"]] assignment_scores = [grade["assignment"] for grade in student["grades"]] # 计算平均分(保留1位小数) avg_discussion = sum(discussion_scores) / len(discussion_scores) avg_quiz = sum(quiz_scores) / len(quiz_scores) avg_assignment = sum(assignment_scores) / len(assignment_scores) # 总平均分(默认三类成绩权重相同,可根据需求调整) avg_total = (avg_discussion + avg_quiz + avg_assignment) / 3 print(f"{student['name']}:") print(f" 讨论平均分:{avg_discussion:.1f}") print(f" 测验平均分:{avg_quiz:.1f}") print(f" 作业平均分:{avg_assignment:.1f}") print(f" 总平均分:{avg_total:.1f}")
方案优势
- 数据关联紧密:每个学生的成绩都绑定在自己的条目下,彻底解决了原代码中成绩与学生分离的问题。
- 扩展性强:后续新增成绩类型、调整成绩次数,只需修改少量代码即可适配。
- 可读性高:变量命名和结构逻辑清晰,后续维护或修改更便捷。
内容的提问来源于stack exchange,提问作者PatGat
相关产品推荐
相关产品推荐

