Python练习题:选课逻辑代码输出异常,请求调试分析
代码问题分析请求
测试用例
输入:
2 6 1 alex 1 Alex 2 sam 1 alix 1 Alix 2 caM
预期输出:alex, sam
实际输出:alex, Alex
练习题背景说明
Dan宣布下学期将开设n门绝密课程,学生需通过邮件而非ACORN系统报名。课程编号为1到n(顺序任意)。若学生s想报名课程c,需发送包含“c s”的邮件;若学生想报多门课,需发送多封邮件,每门课对应一封。
Dan收到邮件c s后,会查看课程c已报名的学生列表:若列表中已有与s“过于相似”的姓名,则视为同一学生,忽略该邮件;否则将s纳入课程c的报名列表。
Dan定义“过于相似”的姓名为:长度相同,且最多有一个字符不同(注意a和A视为同一字符)。例如,“Josh”和“Josh”、“Sam”和“CaM”均过于相似;但“Max”和“Cat”、“Ann”和“Anne”则不属于此类。
需求:输入邮件信息,按报名顺序输出每门课程的报名学生列表。
现有代码
u = input() u, w = u.split() courses = int(u) students = int(w) names = [] classes = [] for i in range(students): names_input = input() selection = names_input.split() course_num = selection[0] student_name = selection[1] if course_num not in classes: classes.append(course_num) names.append(student_name) else: if student_name not in names: names.append(student_name) print(classes) print(names) for i in range(0, len(classes)): print(names[i])
问题分析思路
- 数据结构设计错误:用
classes存课程编号、names存学生姓名的方式完全不符合需求,两个列表一一对应的结构只能给每门课程存一个学生,但实际每门课程需要维护一个独立的报名学生列表。正确做法是用字典,比如course_students = {'1': [], '2': []},键为课程编号,值为对应课程的已报名学生列表。 - 未实现核心的“相似姓名”判断逻辑:代码仅通过
student_name not in names做严格相等判断,完全忽略了题目中“长度相同、最多一个字符不同(大小写视为同一)”的相似规则。需要编写辅助函数,比如is_similar(name1, name2),先统一转成小写(或大写),再判断长度是否一致,最后统计不同字符的数量是否≤1。 - 业务逻辑流程错误:处理每封邮件时,没有找到对应课程的学生列表进行校验,而是错误地将课程是否首次出现作为判断条件,导致后续同课程的学生直接追加到全局列表,完全没有按课程维度去校验相似性。正确流程应为:找到当前课程的学生列表,遍历列表中的每个姓名,用辅助函数判断是否存在相似姓名,若不存在则将当前学生加入该列表。
- 输出逻辑错误:最后仅打印
names列表的元素,根本不是每门课程的学生列表集合,正确的输出应该是按课程顺序(或报名顺序)输出每门课程的学生,用逗号分隔。
内容的提问来源于stack exchange,提问作者HSW
相关产品推荐
相关产品推荐

