首先,無論你做什麼都需要從文件中讀取多達10行。
如果您只想保留前10個分數,然後停止錄製新分數,那很容易。我將使用linecache
模塊提高效率(因此,如果您連續1000次呼叫storescores
,它會記住它已經在尋找並且未能找到第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)
如果你想頂部 10分,你可以做同樣的事情,但增加在中間的排序步驟。沒有必要編寫明確的選擇排序或冒泡排序 - 事實上,你不想這麼做,因爲這些排序算法並不是首選。只需撥打名單上的sort
方法即可。
棘手的一點是,要排序的得分,而不是整個行(否則「鮑伯100」比「安德魯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個條目時它不重要)。等等。但是這應該足以讓你開始。
你想只有_top_ 10分數嗎?或者只有最近的10家商店?或者只有_first_ 10分數? – abarnert
如果「只有前10個分數」意味着如果我擊敗了一個分數,那麼最低分被刪除並且新分數被添加,那麼是的,如果它不是太麻煩 – RyanH2796