如何创建一个字典,我在其中添加文本文件中的名称?

时间:2015-02-19 17:46:19

标签: python dictionary add

我正在尝试制作一种评分系统,我得到了一个带有大量(玩家)的文本文件。我创建了一个字典,并设法在其中添加所有名称,但是当我尝试添加点时,它们只获得最后一个数字,而不是所有这些都为每个名称组合。那么如何为每个名称创建一个新词典,然后添加与名称对应的点?

所以我基本上需要拿一个名字“Anders Johansson”并在字典中将他的分数加到他的名字中,他的名字会多次存在于score.txt中,分数不同。

我的想法是,我需要运行整个乐谱文件并创建每个名称的一个实例,然后将相应的乐谱添加到每个名称,“Anders Johansson”在score.txt中最多可能出现100次。 这段代码会将名字输入到final_score而不是总分。

final_list, file, final_score = [], open('score.txt','r'), {}
string = file.read()
lista = string.split('\n') 
lista.sort()
for i in lista[1:]:
    final_score[str(i[0:-2])] = 0
    final_score[str(i[0:-2])] += int(i[-2:]) # possible error location
final_list = list(final_score.items())
print(sorted(final_list, key=lambda score: score[1],reverse=True))

Example from the file:
Anders Johansson 1
Karin Johansson 1
Eva Johansson 0
Erik Andersson 1
Gunnar Andersson 2
Eva Andersson 1
Nils Eriksson 1
Anders Eriksson 0
Maria Eriksson 1
and so on:

1 个答案:

答案 0 :(得分:2)

使用collections.defaultdict

from collections import defaultdict

final_score = defaultdict(int)

for i in lista[1:]:
    final_score[str(i[0:-2])] += int(i[-2:]) # 

在您的代码中,每次找到名称/密钥时,您都会使用0将值重置保持为final_score[str(i[0:-2])] = 0,这就是为什么您实际上每次只添加最后一个分数。

您需要检查密钥是否存在并根据结果继续进行,或者更简单的方法是在您自己的代码中使用dict.setdefault创建key/value配对密钥不存在或者什么都不做:

for i in lista[1:]:
    final_score.setdefault(str(i[0:-2]), 0)
    final_score[str(i[0:-2])] += int(i[-2:]) # possible error location

你也做了比需要更多的工作,没有必要排序,我们可以迭代文件对象并使用rsplit来获取namescore

final_score =  defaultdict(int)

with open('score.txt','r') as f: # with will automatically close your file
    for line in f: # iterate over file object
        # split once on whitespace from right side of string, separating name from score 
        name, score = line.rsplit(None,1)  # unpack 
        # use our defaultdict to increment the score
        final_score[name] += int(score) 

# just call sorted on .items()
print(sorted(final_score.items(), key=lambda score: score[1], reverse=True))

没有必要排序,因为每当我们遇到一个名字时,我们更新了dict中的值,我们遇到的名称顺序无关紧要,这确实是使用dict的优点之一。

同样使用operator.itemgetterfinal_list.items()进行排序比使用lambda更有效:

from operator import itemgetter
print(sorted(final_list.items(),key=itemgetter(1),reverse=True))