Python 从统计文件生成计数字典
我有一个这样的统计文件:Python 从统计文件生成计数字典,python,dictionary,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:
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)
有更好的方法吗?还是这是唯一的办法
谢谢。使用:
使用:
对于小文件,您可以使用
.readlines()
,但这将一次性将文件的全部内容存储到内存中。您可以使用file对象f
作为迭代器来编写它;当您迭代它时,一次只能得到一行输入
因此,写这篇文章最简单的方法是使用@Amber已经显示的defaultdict
,但我的版本没有建立输入行列表;它只是在运行时构建字典
我使用了简洁的变量名,比如dict的d
,而不是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))
对于小文件,您可以使用
.readlines()
,但这将一次性将文件的全部内容存储到内存中。您可以使用file对象f
作为迭代器来编写它;当您迭代它时,一次只能得到一行输入
因此,写这篇文章最简单的方法是使用@Amber已经显示的defaultdict
,但我的版本没有建立输入行列表;它只是在运行时构建字典
我使用了简洁的变量名,比如dict的d
,而不是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))
您应该删除
lines=f.readlines()
并在with语句中的for line in f
中迭代f,或者他可以将for
块放在with块中。您应该删除lines=f.readlines()
,只需在with语句的中的行中重复f,或者他可以将for
块放在with块中。谢谢。但是为什么我得到的输出是defaultdict(,{'orange':12,'mango':14,'apple':16,'banana':14})
?这正是defaultdict默认打印的内容。字典以随机顺序打印它们的值。。。你可以很容易地使输出,但你想与一个循环;我会修改答案以按顺序打印。谢谢。我知道dict的行为。但是defaultdict
似乎打印了一个元组(键入,dict)
。我只是想知道如何只获取dict
部分。这是一个改进的版本,可以很好地对输出进行排序,并以很好的格式打印。这里有一个棘手的方法来完成您刚才要求的:打印dict。
我们使用。\uuuuu repr\uuuuu()
方法函数显式地从dict
类中获取,而不是在打印时隐式地从defaultdict
类中获取。谢谢。但是为什么我得到的输出是defaultdict(,{'orange':12,'mango':14,'apple':16,'banana':14})
?这正是defaultdict默认打印的内容。字典以随机顺序打印它们的值。。。你可以很容易地使输出,但你想与一个循环;我会修改答案以按顺序打印。谢谢。我知道dict的行为。但是defaultdict
似乎打印了一个元组(键入,dict)
。我只是想知道如何只获取dict
部分。这是一个改进的版本,可以很好地对输出进行排序,并以很好的格式打印。这里有一个棘手的方法来完成您刚才要求的:打印dict。
我们使用。\uuuuu repr\uuuuu()
方法函数显式地从dict
类中获取,而不是在打印时隐式地从defaultdict
类中获取。