我正在用坚果壳制作骰子游戏,并将分数保存到外部文件名“得分”
Krystian: 5
Adam: 7
Unknown: 2
AWD: 18
Muaadh: 5
Yasir: 6
Zaim: 7
Ishfaq: 5
Tanzeel: 87
Hamzah: 3
Mohammed: 5
Robert: 6
Yasir: 5
Krystian: 61
Natalie: 72
,这些是用户名及其分数。我见过一些csv排序算法,但是问题是我只是一个初学者,我对它们的工作方式一无所知,因此我无法真正使用它们。我真正在寻找的是关于如何将他们从最高分降到最低分的一种解释,我希望该程序可以打印出前5名球员。
with open('scores.txt', newline='') as f:
data = [{k: v for k, v in row.items()} for row in csv.DictReader(f, delimiter=':', fieldnames=['name', 'score'], quoting=csv.QUOTE_NONE)]
sorted_data = sorted(data, key = lambda i: i['score'], reverse=True)
for x in sorted_data:
print (x['name'] + ': ' + x['score'])
到目前为止,我已经设法从其他帖子中“复制”了所有内容,但仍然无法正常工作。我认为值得分享的是,当您运行该程序时,它会询问用户他们的名字,然后得到他们的分数,然后将其保存到文件中,最后是我问用户是否希望看到前5名玩家的信息,所以这就是我希望程序对外部文件进行排序并打印出前5名播放器的地方。 我确实道歉,因为我看到过很多这样的帖子,但我自己自己发布此帖子的唯一原因是因为我真的不了解其中任何一个。感谢您所做的一切。
答案 0 :(得分:0)
我认为您的问题之一是使用字典,字典是非顺序的,不支持排序。您可以改为在文件中列出每个名称和得分对的列表。只需将分数放在首位,然后您就可以在此列表中进行排序:
highscores = []
with open('scores.txt') as file_object:
for line in file_object:
name, score = line.rstrip().split(':')
highscores.append ([int(score), name])
sorted_scores = sorted(highscores)
然后,如果要打印分数:
for score, name in sorted_scores:
print (name + ': ' + str(score))
答案 1 :(得分:0)
您已经完成了80%的操作,您只需要隔离前5个得分,除去开头的空格,然后将字符串转换为整数即可。我建议您使用字典而不是csv文件,但是您正在使用的东西。您的csv中也有重复项,使用字典即可解决。
with open('scores.txt', newline='') as f:
# Stripping the leading spaces off of the numbers and names
data = [{k.strip(): v.strip() for k, v in row.items()} for row in csv.DictReader(f, delimiter=':', fieldnames=['name', 'score'], quoting=csv.QUOTE_NONE)]
# Making the string an integer
sorted_data = sorted(data, key = lambda i: int(i['score']), reverse=True)
# Isolating the top 5 results using indexes.
for x in sorted_data[:5]:
print (x['name'] + ': ' + x['score'])