基于名称的字符串分组

时间:2012-10-04 16:20:27

标签: python string string-parsing

我正在尝试自己学习一些python编码,我遇到了这个问题::

输入文本文件内容::

10280341|2012-10-03 19:11:06.390|Sami|abc|Crossword|70
10280343|2012-10-03 19:15:32.173|Sami|aaa|Sudoku|30
10280355|2012-10-04 19:18:32.173|miami|bbb|Chaircar|15
10280366|2012-10-04 19:19:32.173|miami|bob|Avista|35

预期输出::

2012-10-03 Sami|2|100
2012-10-04 miami|2|50

我知道这可以通过String Parsing&匹配,但我不知道,从哪里开始。任何链接或指针对任何类似的问题都非常有帮助。 TIA

2 个答案:

答案 0 :(得分:1)

使用csv读取文件。排序后,使用itertools.groupby()对行进行分组。使用sum()通过generator expression汇总分组行中的每个值。

答案 1 :(得分:1)

您可以使用已经建议的itertools.groupby,或者使用已经是生成器的csv.reader对象和collections.defaultdict来聚合值列...

import csv
from collections import defaultdict

summary = defaultdict(list)
csvin = csv.reader(open('testdata.txt'), delimiter='|')
for row in csvin:
    summary[(row[1].split(' ')[0], row[2])].append(int(row[5]))

csvout = csv.writer(open('testdata.out','wb'), delimiter='|')
for who, what in summary.iteritems():
    csvout.writerow( [' '.join(who), len(what), sum(what)] )

如果您正在查看更复杂的交叉制表/旋转等...,那么可能值得查看pandas这是一个基于numpy的非常有用的库