Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从统计文件生成计数字典_Python_Dictionary - Fatal编程技术网

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
类中获取。