Python读取高分文件时,如何按完整数值排序而非仅按首数字?
问题:按完整数值排序高分数据,提取前5名展示
我正在编写代码从外部文件读取高分数据,提取前5名并展示。目前已接近完成,但代码仅识别高分的首数字,导致12这类分数被判定为小于8。请问如何实现按完整数值进行排序?
外部文件 highscore.txt 内容:
('Louis', 18) ('Louis', 4) ('Louis', 2) ('Louis', 4) ('Troy', 0) ('Andre', 6) ('Louis', 1) ('Louis', 17) ('Louis', 3) ('Louis', 9)
当前错误输出:
('Louis', 9) ('Andre', 6) ('Louis', 6) ('Louis', 4) ('Louis', 4)
当前代码:
with open('highscore.txt', 'r') as score_file: scores = [line.split(' ') for line in score_file] scores.sort(key=lambda x: x[1], reverse=True) print('The highscores are...\n') for i in range(0, 5): print(' '.join(scores[i]))
解决方案
问题根源
你的代码把分数当作字符串排序了。line.split(' ') 分割后,x[1] 是类似'18'、'9'的字符串,字符串比较是按字符逐个对比:'9'的首字符'9'比'18'的首字符'1'大,所以排序结果错误。
修改后的代码
with open('highscore.txt', 'r') as score_file: scores = [] for line in score_file: # 清理每行的首尾括号和换行符 cleaned = line.strip().strip('()') # 分割姓名和分数(按", "拆分) name_part, score_part = cleaned.split(', ') # 去掉姓名的单引号,将分数转为整数 name = name_part.strip("'") score = int(score_part) scores.append( (name, score) ) # 按分数降序排序,此时score是整数,排序逻辑正确 scores.sort(key=lambda x: x[1], reverse=True) print('The highscores are...\n') # 按原格式输出前5名 for i in range(5): name, score = scores[i] print(f"('{name}', {score})")
代码说明
- 正确解析数据:不再直接按空格分割,而是先清理每行的括号和换行,拆分出姓名和分数后,将分数转换为整数类型。
- 整数排序:排序时使用整数类型的分数作为key,确保按数值大小排序。
- 还原输出格式:用f-string将姓名和分数拼接回原文件的格式。
正确输出结果
The highscores are... ('Louis', 18) ('Louis', 17) ('Louis', 9) ('Andre', 6) ('Louis', 4)
内容的提问来源于stack exchange,提问作者LeinJenks
相关产品推荐
相关产品推荐

