我有一个像这样的统计文件:
dict-count.txt
apple 15
orange 12
mango 10
apple 1
banana 14
mango 4
我需要计算每个元素的数量并创建一个这样的字典:{'orange': 12, 'mango': 14, 'apple': 16, 'banana': 14}
。我这样做是为了实现这个目标:
from __future__ import with_statement
with open('dict-count.txt') as f:
lines = f.readlines()
output = {}
for line in lines:
key, val = line.split('\t')
output[key] = output.get(key, 0) + int(val)
print output
我特别关注这一部分:
key, val = line.split('\t')
output[key] = output.get(key, 0) + int(val)
有更好的方法吗?或者这是唯一的方法?
感谢。
答案 0 :(得分:4)
对于小文件,您可以使用.readlines()
,但这样可以一次性将文件的全部内容粘贴到内存中。您可以使用文件对象f
作为迭代器来编写它;当你迭代它时,你一次得到一行输入。
所以,最简单的方法是使用defaultdict
作为@Amber已经显示,但我的版本没有构建输入行列表;它只是建立了字典。
我使用简洁的变量名称,例如d
用于dict而不是output
。
from __future__ import with_statement
from collections import defaultdict
from operator import itemgetter
d = defaultdict(int)
with open('dict-count.txt') as f:
for line in f:
k, v = line.split()
d[k] += int(v)
lst = d.items()
# sort twice: once for alphabetical order, then for frequency (descending).
# Because the Python sort is "stable", we will end up with descending
# frequency, but alphabetical order for any frequency values that are equal.
lst.sort(key=itemgetter(0))
lst.sort(key=itemgetter(1), reverse=True)
for key, value in lst:
print("%10s| %d" % (key, value))
答案 1 :(得分:3)
使用defaultdict
:
from __future__ import with_statement
from collections import defaultdict
output = defaultdict(int)
with open('dict-count.txt') as f:
for line in f:
key, val = line.split('\t')
output[key] += int(val)
print output