1

次の(スペースで区切られた)入力があります:

2012-10-05 PETER 6  
2012-10-05 PETER 4  
2012-10-06 PETER 60
2012-10-06 TOM 10  
2012-10-08 SOMNATH 80 

そして、次のパイプ区切り出力を実現したいと思います:(列は[DATE AND NAME、NUM ENTRIES、SUM OF LAST COL])

2012-10-05 PETER|2|10  
2012-10-06 PETER|1|60  
2012-10-06 TOM|1|10  
2012-10-08 SOMNATH|1|80  

これはこれまでの私のコードです:

s = open("output.txt","r")
fn=s.readlines()
d = {}
for line in fn:
 parts = line.split()
 if parts[0] in d:
   d[parts[0]][1] += int(parts[2])
   d[parts[0]][2] += 1
 else:
d[parts[0]] = [parts[1], int(parts[2]), 1]
for date in sorted(d):
   print "%s %s|%d|%d" % (date, d[date][0], d[date][2], d[date][1])

私は次のように出力を取得しています:

2012-10-06 PETER|2|70

それ以外の

2012-10-06 PETER|1|60

TOMリストに表示されていません。

コードを修正するには何をする必要がありますか?

4

2 に答える 2

2
d = collections.defaultdict(list)
with open('output.txt', 'r') as f:
    for line in f:
        date, name, val = line.split()
        d[date, name].append(int(val))

for (date, name), vals in sorted(d.items()):
    print '%s %s|%d|%d' % (date, name, len(vals), sum(vals))
于 2012-10-06T09:12:49.800 に答える
0

<3itertools

import itertools
with open('output.txt', 'r') as f:
    splitlines = (line.split() for line in f if line.strip())
    for (date, name), bits in itertools.groupby(splitlines, key=lambda bits: bits[:2]):
        total = 0
        count = 0
        for _, _, val in bits:
            total += int(val)
            count += 1
        print '%s %s|%d|%d' % (date, name, count, total)

使用したくない場合groupby(利用できないか、入力データの並べ替えが保証されていない場合)、従来のソリューションを次に示します (これは事実上、コードの修正バージョンにすぎません)。

d = {}
with open('output.txt', 'r') as f:
    for line in f:
        date, name, val = line.split()
        key = (date, name)
        if key not in d:
            d[key] = [0, 0]
        d[key][0] += int(val)
        d[key][1] += 1

for key in sorted(d):
    date, name = key
    total, count = d[key]
    print '%s %s|%d|%d' % (date, name, count, total)

(date, name)を単に使用する代わりにキーとして使用することに注意してくださいdate

于 2012-10-06T08:51:28.720 に答える