Python嵌套列表实现获取第二低成绩学生功能:Jupyter运行正常但测试编辑器报错求助
问题诊断与修复
看起来你的代码在常规测试用例下工作正常,但测试平台的边界用例戳中了代码的漏洞——当所有学生的成绩完全相同时,你的代码会抛出索引错误。
让我拆解一下问题:
- 你用
values=list(set(values))去重成绩,这一步没问题,但如果所有成绩都一样,去重后的values就只有1个元素。 - 之后你直接访问
values[1],这时候就会触发IndexError: list index out of range,这就是测试平台报错的核心原因。 - 另外还有个小细节:测试平台的输入可能带有多余空格,直接用
input()读取可能会引入不必要的空格,影响姓名排序或成绩判断。
修复后的代码
if __name__ == '__main__': students = [] # 读取学生信息,同时处理输入首尾空格 for _ in range(int(input())): name = input().strip() score = float(input().strip()) students.append([name, score]) # 获取去重后的成绩并排序 unique_scores = sorted({student[1] for student in students}) # 先判断是否存在第二低成绩(至少两个不同分数) if len(unique_scores) >= 2: second_lowest_score = unique_scores[1] # 筛选出对应学生并按字母排序 target_students = sorted([s[0] for s in students if s[1] == second_lowest_score]) # 逐行打印姓名 for name in target_students: print(name) # 如果所有成绩相同,没有第二低成绩,按题目要求无需输出
关键优化点
- 边界情况处理:增加了
len(unique_scores) >= 2的判断,彻底避免索引越界的问题。 - 输入健壮性:用
.strip()去除输入字符串的首尾空格,适配测试平台可能的格式化输入。 - 代码简洁性:用集合推导式直接生成成绩集合,替代原代码的循环添加逻辑,更高效简洁。
为什么Jupyter里没问题?
因为你在Jupyter测试的都是符合预期的常规用例(至少有两个不同成绩),所以values的长度足够,不会触发索引错误。但测试平台会覆盖各种边界场景,比如所有学生成绩相同、只有1个学生等,这时候原代码就会失效。
内容的提问来源于stack exchange,提问作者Amoungui Serge
相关产品推荐
相关产品推荐

