2015-02-08 69 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

相关问题