我的文件得分如下:
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
答案 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)) }