2015-02-08 47 views
1


我最近爲我的同事創建了一個猜謎遊戲,作爲學習Python 3.3x的項目。我一直在存儲的名稱和得分格式的文本文件,用冒號分隔的結果,如圖所示...在Python中爲每個密鑰存儲最多5個值字典

Adam:12 
Dave:25 
Jack:13 
Adam:34 
Dave:23 

文本文件閱讀下面的代碼,這要歸功於帕德里克·坎寧安。

from collections import defaultdict 
d = defaultdict(list) 
with open('guesses.txt') as f: 
    for line in f: 
     name,val = line.split(":") 
     d[name].append(int(val)) 

for k in sorted(d): 
    print(k," ".join(map(str,d[k]))) 

現在的問題是,我想看看戴夫,亞當和傑克的最近四個分數。我想到的一種方法是以某種方式讀取上面的列表並將其反轉,以便它能夠首先看到最近的結果。我以爲我可以先逆字典,使用下面的代碼行:

inv_map = {v: k for k, v in d.items()} 

但是,這並不工作,因爲它會返回錯誤:

TypeError: unhashable type: 'list' 

正如我想存儲4個最最近的結果,那麼我需要確保每次新結果到達時都刪除最舊的結果,並更新字典。

我該如何確保每個鍵只能分配4個最大值?這可以通過顛倒字典來完成嗎?我試圖看看其他問題是否遵循同樣的原則,但我還沒有發現任何東西。

注意我已經看到了itemgetter方法,但是我對每個鍵都有一個以上的值。

文本文件會出現這樣的:

Adam:12 
Dave:25 
Jack:13 
Adam:34 
Dave:23 
Jack:17 
Adam:28 
Adam:23 
Dave:23 
Jack:11 
Adam:39 
Dave:44 
Jack:78 
Dave:38 
Jack:4  
+1

[A用戶評分節約計劃]的可能重複(http://stackoverflow.com/questions/28326725/a-user-score-saving-program) – 2015-02-08 08:14:00

+1

正如你可以重複看到,你可以序列化到文件真正的Python對象(在你的情況下,這將是一個字典 - >列表字典),這應該使這**更容易。 – 2015-02-08 08:14:34

回答

2

你可以使用一個defaultdictdeque(maxlen=4)來處理。

import collections 

d = collections.defaultdict(lambda: collections.deque(maxlen=4)) 
# defaultdict accepts as an argument a function that returns the default 
# state of the value of undefined keys. In this case we make an anonymous 
# function that returns a `collections.deque` with maxlen of 4. 

# we could also do 
# # import functools, collections 
# # d = collections.defaultdict(functools.partial(collections.deque, 
# #            maxlen=4)) 

with open('path/to/file.txt', 'r') as infile: 
    for line in infile: 
     player,score = line.strip().split(":") 
     d[player].append(int(score)) 

然而,你可能最好是創建這個數據結構來開始和酸洗對象。

import pickle 

# `highscores` is some previously populated high score dict 

def save_scores(filename): 
    with open(filename, 'w') as outfile: 
     pickle.dump(highscores, outfile) 

def load_scores(filename): 
    with open(filename, 'r') as infile: 
     highscores = pickle.load(infile) 
    return highscores 
+0

噢,好的。但是,當我使用我的'print(dict(d))'方法時,它打印出這個: – 2015-02-08 08:25:40

+0

'{'Jack':deque([17,11,78,4],maxlen = 4),'Dave': deque([23,23,44,38],maxlen = 4),'Adam':deque([34,28,23,39],maxlen = 4)}' – 2015-02-08 08:25:56

+0

我如何擺脫deque和maxlen元素來揭示字典本身?或甚至更好,我怎麼才能整齊地打印它,所以它只能讀取沒有托架的傑克17 11 78 4'? @adamsmith – 2015-02-08 08:26:53

相關問題