在字典中寻找改进的分数计算

时间:2016-02-29 10:42:48

标签: python python-3.x dictionary

我正在尝试使用名为“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的新手,所以我正在寻找改进代码的方法。

3 个答案:

答案 0 :(得分:2)

它看起来并不太疯狂,但我有一些建议:

  • 命名Python convention是描述性名称(分数而不是d)。
  • File opening最好使用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)使用相同的方法,我已将其存储在变量中并重新使用它。
  • 由于字典的值只是int类型,我使用了defaultdict

答案 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