2015-04-30 149 views
-4

所以我試圖創建的基本概念是通過.txt文件進行搜索並找到遊戲的最高得分者並將他所得到的所有關卡的得分結合起來。更多信息: .txt文件我是按以下格式:從.txt文件中讀取Python

Username:level:Score 
Starplayer:2:24 
John:2:14 
Starplayer:3:14 

如上實例的最高得分手是Starplayer得分爲38分,因爲它是兩個分數相結合。以下是我迄今爲止得到:

search = input("Enter the player name you want to search up for: ") 
print("\nThe level scores for ",search," are:\nGame Level  Score:") 
searchfile = open("playerScores.txt", "r") 
for line in searchfile: 
    if search in line: print("Level: ",(line.split(",")[1]),"   Score: ",(line.split(",")[2])) 
searchfile.close() 

以上認定的.txt文件一個sepcific球員的名字,並告訴你他們的得分。現在,也許可以結合一些額外的代碼來查找for循環中的所有分數,並且在找到最高分數之前不停止。我不是100%如何自己做,雖然我在這裏尋求幫助。 謝謝你這麼多,如果你有任何建議:)

+0

我不清楚你在做什麼。你在尋找最高得分手嗎?還是你在尋找在你的輸入中得到了名字的球員的結果? – daphshez

+1

看起來你也是創建這個樂譜文件的人。爲什麼不使用更好的數據結構?你可以使用CSV或SQLITE,甚至可以使用pickle來保存你的分數。 –

+0

@InbarRose看起來他已經在使用CSV了。但我同意一個數據庫(無論是SQL還是dbm/shelve或其他)會使事情變得更容易。 – abarnert

回答

3

這是一個更容易在這裏使用的字典

players = {} 
with open("playerScores.txt", "r") as searchfile: 
    searchfile.readline() # skip headers 
    for line in searchfile: 
     line = line.rstrip().split(":") 
     if line[0] in players: 
      players[line[0]] += int(line[2]) 
     else: 
      players[line[0]] = int(line[2]) 
players = [[v,k] for k,v in players.items()] 
players.sort(reverse=True) 
# players is now in order of highest scoring players with it [score,name] for each element 

之所以用字典是它使人們更方便跟蹤見過的球員(因爲您可以將名稱作爲字典中的鍵並指向分數值)。

然而,如果你真的想要,你可以用列表來做到這一點。這隻需要遍歷我們的列表,直到我們找到合適的玩家來添加分數。它在功能上等同於上述,但速度較慢。

players = [] 
with open("playerScores.txt", "r") as searchfile: 
    searchfile.readline() # skip headers 
    for line in searchfile: 
     line = line.rstrip().split(":") 
     found = False 
     for i in range(len(players)): 
      if players[i][1] == line[0]: 
       players[i][0] += int(line[2]) 
       found = True 
     if not found: 
      players.append([int(line[2]),line[0]]) 
players.sort(reverse=True) 

兩個答案給你的形式[[top-score, player], [second-score, player],...]

正如評論所說,如果你只在頂級球員(沒有人)有興趣的名單列表,而不是排序,你可以使用max(players),這將返回頂部[score, player]對。

+0

很好的答案,但你不需要裝飾和排序;你可以使用一個鍵:'players = sorted(players.items(),key = itemgetter(1),reverse = True)'或類似的。 – abarnert

+0

或者你可以使用'max'而不是排序(或者如果他想要排名前10而不是排名前1的話,則使用'heapq.nlargest')。 – abarnert

+0

你沒有考慮到playerScores.txt中的'Username:level:Score'。如果你不考慮這一點,那麼兩者都很好! – zazga

2

我也是python字典的忠實粉絲。你循環播放文件,將每個播放器添加到字典中,如果它沒有在那裏。如果它在那裏,你只需將已經存在的分數與你閱讀的分數結合起來。

score_dictionary = {} 

with open('scorefile.txt') as handle: 
    for line in handle: 
     line = line.rstrip() 
     name = line.split(":")[0] 
     score = int(line.split(":")[2]) 

     if name not in list(score_dictionary): 
      score_dictionary[name] = score 
     else: 
      score_dictionary[name] = score_dictionary[name] + score 

values = list(score_dictionary.values()) 
keys = list(score_dictionary.keys()) 
print keys[values.index(max(values))], max(values) 

在這種情況下,你應該重寫你的分數文件,以便它不再包含頁眉和它看起來像這樣:

Starplayer:2:24 
John:2:14 
Starplayer:3:14 

這個腳本會給下面的輸出:

Starplayer 38