统计文件中的建筑计数字典

时间:2012-04-14 03:03:46

标签: python dictionary

我有一个像这样的统计文件:

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)

有更好的方法吗?或者这是唯一的方法?

感谢。

2 个答案:

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