包含数字和名称排序的列表

时间:2018-10-25 08:45:10

标签: python string python-3.x sorting python-3.4

因此,此程序将存储名称和分数,然后将其存储在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()

如果有人知道我该如何解决,将不胜感激

3 个答案:

答案 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))