Python:计算行并区分它们

时间:2010-03-24 19:05:53

标签: python count

我正在使用一个应用程序根据一分钟内完成的事情提供定时输出,我希望手动获取输出(复制粘贴)并拥有我的程序,我希望计算多少完成每一分钟的时间。

示例输出是:

13:48 An event happened.
13:48 Another event happened.
13:49 A new event happened.
13:49 A random event happened.
13:49 An event happened.

因此,程序需要了解在13:48发生了2件事,在13:49发生了3件事。我不确定如何存储信息,但我需要对它们进行平均,以确定它发生频率的平均值。抱歉这么复杂!

5 个答案:

答案 0 :(得分:4)

您可以将时间用作字典的键并将其指向事件消息列表。该值的长度将为您提供事件的数量,同时仍然让您自己了解特定事件:

>>> from pprint import pprint
>>> from collections import defaultdict
>>> events = defaultdict(list)
>>> with open('log.txt') as f:
...     for line in f:
...         time, message = line.strip().split(None, 1)
...         events[time].append(message)
... 
>>> pprint(dict(events)) # pprint handles defaultdicts poorly
{'13:48': ['An event happened.', 'Another event happened.'],
 '13:49': ['A new event happened.',
           'A random event happened.',
           'An event happened.']}

如果你想要更加花哨,你可以将时间解析为时间对象。

编辑:考虑Mike Graham的建议。

答案 1 :(得分:3)

如果你只想要计算每分钟发生多少事件,那么你真的不需要python,你可以从bash中做到:

 cut -d ' ' -f1 filename | uniq -c

给出

  2 13:48
  3 13:49

答案 2 :(得分:1)

如果您不需要知道发生了什么,只知道发生了多少次:

$ python3.1 -c'from collections import Counter
import fileinput
c = Counter(line.split(None, 1)[0] for line in fileinput.input() if line.strip())
print(c)' events.txt 

输出:

Counter({'13:49': 3, '13:48': 2})

答案 3 :(得分:1)

您还可以使用groupby模块中的itertools函数将时间作为分组键。

>>> import itertools
>>> from operator import itemgetter
>>> lines = (line.strip().split(None, 1) for line in open('log.txt'))
>>> for key, group in itertools.groupby(lines, key=itemgetter(0)):
...     print '%s - %s' % (key, map(itemgetter(1), group))
... 
13:48 - ['An event happened.', 'Another event happened.']
13:49 - ['A new event happened.', 'A random event happened.', 'An event happened.']

答案 4 :(得分:0)

awk '{_[$1]++}END{for(i in _) print i,_[i]}' filename