如何创建字典,在其中向文本文件中的名称添加点?
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:
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
得到name
和score
:
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))
我正在尝试制作一种评分系统,我得到了一个包含大量(玩家)的文本文件。我创建了一个字典并设法在其中添加了所有名称,但是当我尝试添加点时,它们只得到最后一个数字,而不是每个名称的所有组合。那么如何为每个名字创建一个新的字典,然后加上名字对应的点呢?
所以我基本上需要取其中一个名字 "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:
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
得到name
和score
:
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))