Python无导入实现相似字符串过滤及课程排序输出问题
课程学生名单处理:相似姓名过滤与排序修复
需求说明
- 输入第一行格式为
n m,其中n为课程总数,m为学生总数 - 后续
m行输入格式为a b,a为课程编号,b为学生姓名 - 同一课程内,过滤长度相同且仅1个字符存在差异的相似姓名,仅保留首个出现的姓名
- 最终按课程编号的数值升序,输出每门课程的学生名单
现有代码问题
- 输出顺序为课程的输入顺序,未按课程编号升序排列
- 仅判断姓名是否完全重复,未实现相似姓名的过滤逻辑
修正后的代码
# 读取基础输入 n, m = map(int, input().split()) # 存储各课程的学生名单 course_students = {} for _ in range(m): course_num, name = input().split() # 将课程编号转为整数,保证后续排序正确 course_num = int(course_num) if course_num not in course_students: course_students[course_num] = [] # 检查当前姓名是否与已有姓名相似,决定是否保留 keep_name = True for existing in course_students[course_num]: if len(name) == len(existing): # 统计字符差异数 diff_count = sum(1 for c1, c2 in zip(name, existing) if c1 != c2) if diff_count == 1: keep_name = False break if keep_name: course_students[course_num].append(name) # 按课程编号升序遍历输出 for course in sorted(course_students.keys()): print(" ".join(course_students[course]))
关键改动说明
- 课程编号整数化:将读取的课程编号转为整数,避免字符串排序的逻辑错误(如"10"排在"2"前),确保升序排序符合数值逻辑
- 相似姓名过滤:遍历当前课程已有的每个姓名,对比长度和字符差异数,满足「长度相同+仅1个字符差异」的相似姓名直接跳过添加
- 升序输出:使用
sorted()对课程编号排序后遍历,保证输出顺序符合要求
测试验证
测试输入1
2 4 2 David 1 john 2 davin 1 johnn
输出结果
john johnn David
(john与johnn长度不同,不触发过滤;David与davin满足相似条件,保留首个出现的David)
测试输入2
2 davin 1 john
输出结果
john davin
(课程编号按1、2升序排列,符合期望)
内容的提问来源于stack exchange,提问作者pythonnoob
相关产品推荐
相关产品推荐

