因此,此程序将存储名称和分数,然后将其存储在tet文档中,并将其排在前5名的排行榜中,分数后跟名称。
该文件被写为分数,名称,分数,名称...
但是,当打印最终的排序列表时,它将分数作为字符串而不是整数排序-例如。 98 97 87774 384 111 10000000
而不是10000000 87774 384 111 98 97
#importing os
import os
#checkingn if the file is empty
if os.stat("scores.txt").st_size == 0:
#if it is, setting up 5 blank scores to correct the ',' start and to
make the leaderboard more presentable
f = open('scores.txt','w')
f.write('0,Empty,0,Empty,0,Empty,0,Empty,0,Empty')
#input of new score and name
score = input('score: ')
name = input('Name: ')
#storing it
f = open('scores.txt','a+')
f.write(',')
f.write(score)
f.write(',')
f.write(name)
f.close()
#reading the file with , as a split so forming a list
f = open('scores.txt','r')
data = f.readline()
# Get and strip all data from the input string.
numdata = [value.strip() for value in data.split(',') if value is not '']
# Create pair from each name/score
data = list(zip(numdata[0::2], numdata[1::2]))
# Sort by score
leaderboard = sorted(data, key =lambda x: x[0], reverse=True)
print(leaderboard)
f.close()
如果有人知道我该如何解决,将不胜感激
答案 0 :(得分:0)
您可以使用键函数中的int()
构造函数将分数转换为整数,以对分数进行数字排序:
leaderboard = sorted(data, key =lambda x: int(x[0]), reverse=True)
如果只想要前5名,则还应该对结果列表进行切片:
leaderboard = sorted(data, key =lambda x: int(x[0]), reverse=True)[:5]
答案 1 :(得分:0)
您还可以通过以下方式应用int类型:
data.sort(key=int, reverse=True)
dara[:5].sort(key=int, reverse=True) # for first five
数据是字符串数组。
请注意排序已经到位,因此您不会在内存中创建另一个列表。
答案 2 :(得分:0)
要检索前5个得分,则无需对整个得分列表进行排序。您可以使用heapq.nlargest
来跟踪并输出到最高的 n 得分。
当然,主要问题是您需要将字符串转换为整数以进行比较。
from heapq import nlargest
leaderboard = nlargest(5, data, key=lambda x: int(x[0]))
更好地,您可以将输入数据转换为整数开头。然后,您不再需要将str
转换为int
作为排序过程的一部分。像这样:
from heapq import nlargest
from operator import itemgetter
data = [(int(num), name) for num, nam in zip(numdata[0::2], numdata[1::2])]
leaderboard = nlargest(5, data, key=itemgetter(0))