2

私はPythonの初心者ですが、次の方法がわかりません。

この形式の数値データのテキストファイルがあります。

  
1461.5 5 9 -18 32
1462 21 5 -6 32
1462 5 4 -23 32
1462.5 17 6 -7 30
1464 11 6 -14 31
1464 8 2 -22 32
1464.5 9 5 -17 31
1465 6 16 -7 29
1467 9 6 -17 32
1467.5 14 9 -8 31
1469.5 13 5 -12 30
1469.5 14 10 -7 31
1471 15 7 -9 31
1471 12 8 -10 30
1471.5 13 11 -7 31
1472 27 4 -1 32
1472 7 13 -8 28
1472 8 8 -14 30

最初の列で同じ値を持つ行を識別し、他の列に対応する項目を追加し、最初の列の重複するエントリを削除して、結果が次のようになるようにする方法を知りたいと思います。

1461.5 5 9 -18 32
1462 26 9 -29 64
1462.5 17 6 -7 30
1464 19 8 -36 63
1464.5 9 5 -17 31
1465 6 16 -7 29
1467 9 6 -17 32
1467.5 14 9 -8 31
1469.5 27 15 -19 61
1471 27 15 -19 61
1471.5 13 11 -7 31
1472 42 25 -23 90

複雑さが軽減される場合は、最初の列のすべての数値を事前に整数に丸めることができます(後続の計算にはほとんど影響しません)。

注:実際のテキストファイルには23,000行が含まれています。最初の列の値は昇順です。

ありがとう、アダム

4

3 に答える 3

3
from collections import defaultdict
D = defaultdict(list)
with open("data.txt") as f:
    for row in f:
        row = row.split()
        D[float(row[0])].append([int(x) for x in row[1:]])

for k,v in sorted(D.items()):
    print k, [sum(x) for x in zip(*v)]

編集:入力ファイルは常に整然としているので、より良いことができます

from itertools import groupby
with open("data.txt") as f:
    for k,v in groupby(f, key=lambda x:x.split()[0]):
        print k, map(sum, zip(*[map(int, x.split()[1:]) for x in v]))
于 2012-06-29T05:32:57.777 に答える
1

これは機能します:

with open('data.txt') as data:
   d={}
   for row in data:
      l=row.split()
      key=l[0]
      l=[int(e) for e in l[1:]]
      if key in d:
         d[key]=[x+y for x,y in zip(l,d[key])]
      else:
         d[key]=l  

for e in sorted(d.keys()):
    t=tuple([e]+list(map(str,d[e])))
    print("{:<7} {:<3} {:<3} {:<3} {:<3}".format(*t))

版画:

1461.5  5   9   -18 32 
1462    26  9   -29 64 
1462.5  17  6   -7  30 
1464    19  8   -36 63 
1464.5  9   5   -17 31 
1465    6   16  -7  29 
1467    9   6   -17 32 
1467.5  14  9   -8  31 
1469.5  27  15  -19 61 
1471    27  15  -19 61 
1471.5  13  11  -7  31 
1472    42  25  -23 90 
于 2012-06-29T06:46:58.237 に答える