Python嵌套列表按第二个元素排序异常(含10分场景)-HackerRank问题
解决HackerRank嵌套列表问题时的排序异常(含分数10时失效)
我在完成HackerRank的嵌套列表题目时,编写的Python代码出现了问题:当列表中包含分数10时,无法按照第二个元素(分数)正确排序。
原代码
def sort(sub_li): return(sorted(sub_li, key = lambda x: x[1])) if __name__ == '__main__': x=int(input ()) stu=[] record=[] for i in range(0,x): stu.append(input()) stu.append(input()) record.append(stu) stu = [] namelist = [] sortedrecord = sort(record) print(sortedrecord) value = 0 for i,j in sortedrecord: if j>sortedrecord[0][1]: value = j break for i,j in sortedrecord: if j==value: namelist.append(i) namelist.sort() for i in namelist: print(i)
示例输入
4 Shadab 8 Varun 8.9 Sarvesh 9.5 Harsh 10
示例输出
[['Harsh', '10'], ['Shadab', '8'], ['Varun', '8.9'], ['Sarvesh', '9.5']] Shadab
问题原因
核心问题是分数被当作字符串处理了。你输入的分数都是字符串类型(比如'10'、'8'),而字符串排序是按字符的ASCII码值比较的:'10'的第一个字符是'1',ASCII码比'8'的'8'小,所以排序时'10'会排在'8'前面,导致整个排序逻辑完全错误。
修正方案
把输入的分数转换成数值类型(float),确保排序是按数值大小进行的,同时优化找第二低分的逻辑,避免初始值0的潜在问题。
修正后的代码
if __name__ == '__main__': x = int(input()) record = [] for _ in range(x): name = input() score = float(input()) record.append([name, score]) # 按分数排序 sorted_record = sorted(record, key=lambda x: x[1]) # 提取所有分数并去重排序 scores = sorted(list(set(score for _, score in sorted_record))) second_lowest = scores[1] # 收集所有第二低分的学生姓名并排序 result = sorted(name for name, score in sorted_record if score == second_lowest) # 输出结果 for name in result: print(name)
修正说明
- 类型转换:将输入的分数用
float()转换为数值类型,这样排序时会按数值大小比较,10会排在8之后,符合预期。 - 更可靠的第二低分获取:通过提取所有分数去重排序,直接取第二个元素作为第二低分,避免了原代码中初始值0可能带来的错误(比如题目出现负分的情况)。
- 简化代码结构:去掉冗余的
sort函数,直接使用sorted内置函数,同时用生成器表达式简化姓名收集逻辑。
内容的提问来源于stack exchange,提问作者Arjon Nill
相关产品推荐
相关产品推荐

