HackerRank嵌套列表题:排序后无法输出正确的次低分学生名单
HackerRank嵌套列表挑战:输出顺序不符合预期的问题分析与修复
问题重现
你在完成HackerRank嵌套列表挑战时,遇到输出顺序不符合预期的问题:
- 给定输入:
5 Harry 37.21 Berry 37.21 Tina 37.2 Akriti 41 Harsh 39
- 预期输出:
Berry、Harry(按姓名字典序排列) - 实际输出:
Harry、Berry(按输入顺序排列) - 排序后的列表:
[['Tina', 37.2], ['Harry', 37.21], ['Berry', 37.21], ['Harsh', 39.0], ['Akriti', 41.0]]
原代码的问题
- 排序逻辑不完整:你的排序仅以分数为键,同分数的学生保留了输入时的先后顺序,没有按姓名的字典序排序,导致输出顺序不符合题目隐含的格式要求。
- 次低分取值存在隐患:直接取
sortedscore[1][1]作为次低分的逻辑不严谨——如果有多个学生是最低分(比如两个学生都得37.2),那么sortedscore[1][1]仍然是最低分,而非真正的次低分。
修复后的代码
score_list = [] for _ in range(int(input())): name = input().strip() score = float(input().strip()) score_list.append([name, score]) # 双重排序:先按分数升序,分数相同则按姓名字典序升序 sorted_students = sorted(score_list, key=lambda x: (x[1], x[0])) # 提取唯一分数并排序,找到真正的次低分 unique_scores = sorted({student[1] for student in sorted_students}) second_lowest = unique_scores[1] # 输出所有次低分学生的姓名 for student in sorted_students: if student[1] == second_lowest: print(student[0])
修复说明
- 双重排序键:使用
(x[1], x[0])作为排序键,确保分数相同时,学生按姓名的字典序升序排列,直接满足输出顺序要求。 - 可靠的次低分获取:通过集合去重所有分数,再排序后取第二个元素,无论最低分有多少个学生,都能准确拿到次低分。
运行修复后的代码,给定输入会输出Berry和Harry,完全符合预期。
内容的提问来源于stack exchange,提问作者wazowski637
相关产品推荐
相关产品推荐

