0

次のような列のファイルに浮動小数点数のリストがあります。

123.456

234.567

345.678

行の値をそのすぐ上の値から差し引いて生成される出力ファイルを生成するにはどうすればよいですか。上記の入力ファイルの場合、生成される出力は次のようになります。

123.456-123.456

234.567-123.456

345.678-234.567

最初の値はゼロを返す必要がありますが、他の値はそのすぐ上の値で減算される必要があります。これは宿題の質問ではありません。これは私のより大きな問題の小さな要件であり、私はこの時点で立ち往生しています。大変助かります。ありがとう !!

4

3 に答える 3

2

これはうまくいきます:

diffs = [0] + [j - data[i] for i,j in enumerate(data[1:])]

したがって、以下がdata.txt含まれていると仮定します。

123.456
234.567
345.678

それから

with open('data.txt') as f:
    data = f.readlines()
    diffs = [0] + [float(j) - float(data[i]) for i,j in enumerate(data[1:])]

print diffs

譲ります

[0, 111.111, 111.11099999999999]

この回答は、計算された値をさらに処理するために保持することを前提としています。

ある時点で、これらをファイルに 1 行ずつ書き出したい場合は、次のようにします。

with open('result.txt', 'w') as outf:
    for i in diffs:
        outf.write('{0:12.5f}\n'.format(i))

必要に応じてフィールド幅を調整し (現在は 12 個のスペースが予約されており、小数点以下 5 個)、 file に書き出されますresult.txt

更新: (以下のコメントから) メモリに保持するにはデータが多すぎる可能性があるため、このソリューションは機能するはずです。Python 2.6 では、両方のファイルを同じ で開くことができないwithため、別々のステートメントになります。

with open('result2.txt', 'w') as outf:
    outf.write('{0:12.5f}\n'.format(0.0))
    prev_item = 0;
    with open('data.txt') as inf:
        for i, item in enumerate(inf):
            item = float(item.strip())
            val = item - prev_item
            if i > 0:
                outf.write('{0:12.5f}\n'.format(val))
            prev_item = item

少しハック感があります。ただし、メモリ内に巨大なリストを作成しません。

于 2012-06-05T16:33:48.267 に答える
2

与えられた値のリスト:

[values[i] - values[i-1] if i > 0 else 0.0 for i in range(len(values))]
于 2012-06-05T16:34:43.783 に答える
2

リスト内包表記やジェネレーター式の代わりに、任意の複雑なロジックを持ち、膨大なデータ セットを簡単に操作できる独自のジェネレーターを作成してみませんか?

from itertools import imap

def differences(values):
    yield 0  # The initial 0 you wanted
    iterator = imap(float, values)
    last = iterator.next()
    for value in iterator:
        yield value - last
        last = value

with open('data.txt') as f:
    data = f.readlines()

with open('outfile.txt', 'w') as f:
    for value in differences(data):
        f.write('%s\n' % value)

少数の値しか保持していない場合data、その利点は必ずしも明確ではありません (ただし、コード自体の明示性は、来年戻ってきて保守する必要がある場合に役立つかもしれません)。しかしdata、巨大な (または無限の!) ソースからの値のストリームがあり、そこから最初の 1000 個の値を処理したいとします。

diffs = differences(enormousdataset)
for count in xrange(1000):
    print diffs.next()

最後に、これはインデックス化できないデータ ソースでうまく機能します。インデックス番号を追跡して値を検索するソリューションは、ジェネレーターの出力ではうまく機能しません。

于 2012-06-05T17:16:39.733 に答える