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

Python无导入实现相似字符串过滤及课程排序输出问题

课程学生名单处理:相似姓名过滤与排序修复

需求说明

  • 输入第一行格式为n m,其中n为课程总数,m为学生总数
  • 后续m行输入格式为a b,a为课程编号,b为学生姓名
  • 同一课程内,过滤长度相同且仅1个字符存在差异的相似姓名,仅保留首个出现的姓名
  • 最终按课程编号的数值升序,输出每门课程的学生名单

现有代码问题

  1. 输出顺序为课程的输入顺序,未按课程编号升序排列
  2. 仅判断姓名是否完全重复,未实现相似姓名的过滤逻辑

修正后的代码

# 读取基础输入
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:01:22