如何使用Dictionary Comprehension来保持运行总和

时间:2014-09-19 15:58:25

标签: python

我的文件得分如下:

z:100
a:50
c:75
a:-20
c:45
a:10
c:20
z:10
z:-50

我想返回一个字典,其中键是字母,而值是该字母在文件中的值的总和。我不确定在使用这种方法时如何保持总和。

我有

a = {key: value for (key,value) in [line.strip().split(":") for line in    open("scores.txt","r")]}
print a

2 个答案:

答案 0 :(得分:3)

我建议不要在这里把所有东西塞进一行。您可以执行以下操作(使用collections.defaultdict):

from collections import defaultdict

counts = defaultdict(int)

with open('scores.txt', 'r') as f:
    for line in f:
        name, score = line.strip().split(':')
        d[name] += int(score)

答案 1 :(得分:0)

你确定要一个"一行"字典理解?

from itertools import imap, groupby
from operator import methodcaller, itemgetter

a = { k : sum(int(v[1]) for v in v_itr)
       for k, v_itr in groupby(sorted(imap(methodcaller("split", ":"),
                                           imap(methodcaller("rstrip"),
                                                open("scores.txt", "r"))),
                                      key=itemgetter(0)), itemgetter(0)) }

(这不是建议使用此代码;请在arshajii的回答中使用循环。)

使用生成器表达式而不是嵌套调用imap的稍微容易阅读的版本。

a = { k : sum(int(v[1]) for v in v_itr)
       for k, v_itr in groupby(sorted(line.rstrip().split(":")
                                        for line in open("scores.txt", "r"),
                                      key=itemgetter(0)), itemgetter(0)) }