如何在Python中计算文件中的一组字符串?

时间:2014-07-07 05:28:33

标签: python readline python-2.6

我在这里查了几个主题,但没有一个实际符合我的情况。

我基本上有一个看起来像这样的文本文件:

orange 0 0 0
orange 1 0 0
orange 2 0 0
orange 3 0 0
orange 4 0 0
orange 5 0 0
apple 0 0 0
apple 1 0 0
apple 2 0 0
apple 3 0 0
apple 4 0 0
apple 5 0 0
grapes 0 0 0
grapes 1 0 0
grapes 2 0 0
grapes 3 0 0
grapes 4 0 0
grapes 5 0 0

我需要做的是,能够将第一个单词作为字符串,并搜索包含该第一个单词的行数,然后转到下一个单词,并搜索包含该单词的行数。所以结果应该是这样的:

firstTermCount: 6
secondTermCount: 6
thirdTermCount: 6

我需要有这个计数,所以在下一步中我可以有一个命令,该命令应该在该字符串的确切行数范围内运行,以利用每个单词旁边的数字。

这里的问题是,我不知道这些术语实际上会被调用,所以我不能做这整个“Count”或“count_dict”技术我一直看到,因为对我来说它好像你需要为实际查找的函数设置一个名称。另外我不知道每次文件中会有多少行,每次读取文件时都要这样做。我知道我写的例子各有五行,但说实话,我想读的文件类型会有一个随机数行,所以我不能只说“寻找它5次”

任何人都可以提供这个问题的解决方案,或者可能是一个链接到回答这个我可能错过的问题的线程吗?

谢谢

注意:我使用的是Python v2.6.4,如果有帮助的话

修改 所以用户建议我使用Counter功能,或使用这种字典方法,但无论哪种方式,它都不能完全给我我需要的结果。例如,使用此Counter方法(我使用了列出here的工作:

new list:
orange 0 0 0
orange 1 0 0
orange 2 0 0
orange 3 0 0
orange 4 0 0
apple 1 0 0
apple 2 0 0
apple 4 0 0
apple 5 0 0
grapes 1 0 0
grapes 2 0 0
grapes 4 0 0
peaches 0 0 0
peaches 1 0 0
peaches 2 0 0
peaches 3 0 0
peaches 5 0 0
peaches 6 0 0

这就是计数器方法给我的:

{'orange': 5, 'peaches': 6, 'apple': 4, 'grapes': 3}

当我想要的是:

{'orange': 5, 'apple': 4, 'grapes': 3,'peaches': 6 }

我如何按此顺序获得这些计数?

2 个答案:

答案 0 :(得分:2)

您需要的是https://docs.python.org/2/library/collections.html#collections.Counter

>>> from collections import Counter
>>> lines = []
>>> with open('foo.data', 'r') as foo:
...     lines = foo.readlines()
>>> c = Counter([l.split(" ")[0] for l in lines])
>>> c
Counter({'orange': 6, 'apple': 6, 'grapes': 6})

计数器是python 2.7中的新功能,所以这里是"手册"解决方案,保证订单

>>> manual_dict = {}
>>> with open('foo.data', 'r') as foo:
...     lines = foo.readlines()
... 
>>> for idx,l in enumerate(lines):
...     word = l.split(" ")[0]
...     if not word in manual_dict:
...         manual_dict[word] = {'count' : 0, 'pos' : 0}
...     manual_dict[word]['count'] +=1
...     if not manual_dict[word]['pos']:
...         manual_dict[word]['pos'] = idx
... 
>>> for w,w_config in sorted(manual_dict.items(), key=lambda x: x[1]['pos']):
...   print w, w_config['count']
... 
orange 5
apple 4
grapes 3
peaches 6

答案 1 :(得分:0)

我认为问题是您希望按照文件中找到的顺序列出单词以及它们的计数。字典(和Counter,因为它只是一个奇特的字典)是无序的,因为它们的目的是快速查找。

如果您不使用2.7,则集合模块具有OrderedDict以及指向this alternative implementation的链接。

你可以选择实现它,或者你可以通过收集列表中的单词(以保持顺序)及其计数来做更简单的事情:

from __future__ import with_statement

counts = dict()
words = list()

with open('somefile.txt') as f:
   for line in f:
       if len(line.strip()):
           bits = line.split(' ')
           if bits[0] not in words:
               words.append(bits[0])
               counts[bits[0]] = 1
           else:
               counts[bits[0]] += 1

for word in words:
    print 'Word: %s\tCount:%s' % (word, counts[word])