我正在尝试使用名为“score.txt”的文本文件创建一个包含名称和点的字典。 该文件的内容如下所示:
Anders Johansson 1
Karin Johansson 1
Anders Johansson 2
Eva Johansson 0
总共+ 2000个名字和分数
我获得分数,计算和找到高分的方法看起来像这样
f = open('score.txt').read().split()
d = {}
for x in range(0, len(f), 3):
name, value = ' '.join([f[x], f[x+1]]), int(f[x+2])
if(name in d):
d[name] += value
else:
d[name] = value
print(max(d, key=d.get),d[max(d, key=d.get)])
我是python的新手,所以我正在寻找改进代码的方法。
答案 0 :(得分:2)
它看起来并不太疯狂,但我有一些建议:
with
节。 range
。 defaultdict
,因此您无需在dict中测试是否存在。那会产生:
from collections import defaultdict
scores = defaultdict(int)
with open('score.txt') as infile:
for line in infile:
fields = line.split()
name, score = ' '.join([fields[0], fields[1]]), int(fields[2])
scores[name] += score
print(max(scores, key=scores.get), scores[max(scores, key=scores.get)])
答案 1 :(得分:0)
代码的细微更改。这将稍微改善性能。
<强>代码:强>
from collections import defaultdict
datas ="""Anders Johansson 1
Karin Johansson 1
Anders Johansson 2
Eva Johansson 0""".split()
dic = defaultdict(int)
for i in range(0, len(f), 3):
name, value = ' '.join([datas[i], datas[i+1]]), int(datas[i+2])
dic[name] += value
max_key =max(dic, key=d.get)
print(max_key, dic[max_key])
<强>输出:强>
('Anders Johansson', 3)
备注:强>
max(d, key=d.get)
使用相同的方法,我已将其存储在变量中并重新使用它。答案 2 :(得分:0)
您的代码可能出现的唯一语义问题是,如果您需要处理composite names,例如 Pablo Ruiz Picasso 。在这种情况下,程序将中断。此外,如果您的文件很大,为了提高性能,在阅读文件时计算高分会更好。我的问题在以下代码中处理:
from collections import defaultdict
highScore = 0
highScoreName = ""
scores = defaultdict(int)
with open('score.txt') as f:
for line in f:
fields = line.split()
name, score = ' '.join(fields[:-1]), int(fields[-1]) #Handle composite names
scores[name] += score
if scores[name] > highScore: #Compute high score
highScore, highScoreName = scores[name], name
print highScoreName, highScore