如何创建字典,在其中向文本文件中的名称添加点?

How do I create a dictionary where I add points to names form a text file?

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

所以我基本上需要取其中一个名字 "Anders Johansson" 并将他的分数添加到他在字典中的名字中,他的名字将以不同的分数多次出现在 score.txt 中。

我的想法是,我需要把整个乐谱文件都运行下来,每个名字都创建一个实例,然后给每个名字加上对应的乐谱,"Anders Johansson"最多可以出现100次在 score.txt。 此代码会将姓名输入 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:

使用 collections.defaultdict:

from collections import defaultdict

final_score = defaultdict(int)

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

在您的代码中,每次您找到 name/key 所以这就是为什么你每次只实际添加最后一个分数。

您需要检查密钥是否存在并根据结果继续操作,或者更简单的方法是在您自己的代码中使用 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))

不需要排序,因为每当我们遇到一个名字时,我们都会更新字典中的值,不管我们遇到名字的顺序是什么,这确实是使用字典的优势之一。

此外,对于 final_list.items() 的排序,使用 operator.itemgetter 将比使用 lambda 更有效:

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