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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:50:41