2015-04-16 42 views
-2

我試圖保存用戶名稱出現的次數,一旦該次數達到3,它將覆蓋文件上的分數而不是添加它。如何保存最後三個條目

例如;

Jarrod:0 
Jarrod:1 
Jarrod:2 
Jarrod:0 
Jarrod:1 
Jarrod:0 
Jarrod:0 
Jarrod:0 
Jarrod:0 
Jarrod:0 
Jarrod:0 
Jarrod:0 
Jarrod:0 
Jarrod:0 

相反,它會告訴

Jarrod:0 
Jarrod:0 
Jarrod:0 

最後三個分數。

if classs == "1": 
    textfile = open("Class1.txt", "a") 
    textfile.write(name.title()+ ':' + str(score) + "\n") 
    textfile.close() 

with open("Class1.txt") as f: 
    entrylist = [] 
    for line in f: 
     column = line.split(":") 
     namefile = column[0] 
     scores = int(column[1].strip()) 
     entrylist.append(namefile) 

    namecount = [] 
    for word in entrylist: 
     if word not in namecount: 
      namecount += [word] 
    word_count = [] 
    for word in namecount: 
      word_count += [float(entrylist.count(word))] 
    for i in range(len(namecount)): 
     print(namecount[i] + ":" + str(word_count[i])) 

在這裏,我已經成功添加的用戶名來namecount,然後將其添加到word_count其中出現次數保持

如何隔離在某些名稱中的數字計數然後覆蓋用戶最新的分數?

+0

你能解釋一下你的邏輯嗎? – haifzhan

+0

@haifzhan我做了一個測驗,當用戶進行測驗時,它將他的分數保存到一個txt文件中;名稱:得分。我想這樣做,一旦用戶完成了測驗X的次數,而不是添加新的分數,它取代了舊的分數。所以用戶在文本文件中永遠不會比X多。 – JJA

+0

如果是這樣,爲什麼你的輸出示例顯示'Jarrod:0'3次? – haifzhan

回答

1

您可以使用collections.deque對象。 constructor可讓您限制列表的總大小。

我並沒有完全遵循代碼的工作原理,但如果一個文件中有多個用戶,我認爲dictcollections.defaultdict也是更好的選擇。我不確定這是否是您的代碼的要求。

更多的東西是這樣的:(未測試)

import collections 

def new3ElementDeque(): 
    return collections.deque([], 3) 

userTop3 = collections.defaultdict(new3ElementDeque) 

with open("Class1.txt") as f: 
    for line in f: 
     user, score = line.split(':') 
     userTop3[user].append(score) 

這樣,每個用戶都有自己的deque,只有永遠存儲多達三個要素。然後你可以把它們寫出來分開文件。

+0

謝謝。我知道我的列表方法不是最有效的,但由於我對python的知識(這不是很多),它是最簡單的選擇。我會閱讀導入集合。 – JJA

相關問題