我有一段代码将用户名和分数附加到文件中,但我想知道如何制作它,以便任何时候只有10个名称和分数可以在文件中。我的代码如下:
def storescores():
hs = open("hst.txt", "a")
hs.write(name + " ")
hs.write(str(score) + "\n")
hs.close()
有没有办法让它如果10个名字已经在列表中,那么就不能再添加了?如果这需要某种形式的排序方法(选择,泡泡等),那么你也可以把它放进去吗?
答案 0 :(得分:0)
没有内置的方法来做这样的事情。你需要做的是像
答案 1 :(得分:0)
首先,无论你做什么,都需要从文件中读取最多10行。
如果您只想保留前10个分数,然后停止记录新分数,这很容易。我将使用linecache
模块来提高效率(因此,如果您连续1000次调用storescores
,它会记住它已经在寻找并且未能找到第10行)。如果少于10行,则返回空字符串;如果有10行或10行,则返回第10行。所以:
def storescores():
if linecache.getline("hst.txt", 10):
print("Already stored 10 scores, sorry")
return
hs.close()
hs = open("hst.txt", "a")
hs.write(name + " ")
hs.write(str(score) + "\n")
hs.close()
如果您想要最近的10个分数,则必须阅读这些内容,然后写出新文件。像这样:
def storescores():
with open("hst.txt") as hs:
lines = list(hs)
lines.append(name + " " + score + "\n")
lines = lines[-10:]
with open("hst.txt", "w") as hs:
for line in lines:
hs.write(line)
如果你想要 top 10分,你可以做同样的事情,但在中间添加一个排序步骤。没有理由编写明确的选择排序或冒泡排序 - 事实上,你不想这样做,因为这些算法首先不是好的排序算法。只需在列表中调用sort
方法。
棘手的一点是你想要对得分进行排序,而不是整行(否则“Bob 100”的得分高于“Andrew 200”),并且得分作为数字而不是字符串(否则,“2”的分数高于“10”)。因此,您需要一个key function来分割字符串,取最后一位,并将其转换为数字。所以:
def storescores():
with open("hst.txt") as hs:
lines = list(hs)
lines.append(name + " " + score + "\n")
lines.sort(key=lambda line: int(line.split()[-1]))
lines = lines[-10:]
with open("hst.txt", "w") as hs:
for line in lines:
hs.write(line)
有进一步改善这种情况的方法。例如,您可能希望写入新的临时文件,然后在完成后将其复制到文件上(因此如果有人在程序运行过程中拔出插件,而不是在原地重写文件)以旧分数或新分数结束,而不是截断的部分文件。或者您可能希望以最聪明的方式使用heapq
或bisect
模块将新分数放入适当的排序位置,而不是重新排序整个已排序的列表(并不重要。只有10个条目)。等等。但这应该足以让你开始。