
[code]

    data
    a 100 200
    b 250 400
    c 600 1200
    
[/code]

このようなデータがあるときに  
リストに1行目の"a 100 200"と2行目の"b 250 400"を入れ、  
"a-b:50(250-200)"という計算をした後にリストを空にしたいです。

どのような処理をしたらいいでしょうか？

readlineを使ってリストに入れたのですが、次の行をどのように指定していいかわかりません。  
アドバイスお願いいたします。


CC BY-SA 4.0
2019-03-10T12:45:55.760
53342
2019-03-12T02:16:39.597
31682
question
python
python 対象の行と次の行について計算をする


おそらく`for`文で指定行の次の行を取得したいと推測して回答いたします。  
`a-b`ではなく`b-a`と表示したいような気がしますが、サンプルコードは質問に沿った出力を行います。

readlineを使ってリストに入れたならば、リスト変数に対して`list[i+1]のように指定行の次のインデックスを指定して次の行を取得できます。

メモリ使用量は増えますが、`zip`関数を使ってn行目とn+1行目を並行してループすることもできます。

リストを空にする関数として`clear()`が用意されています。

蛇足とは思います(しかもコードが汚いです)が、`pandas`の`concat`, `shift`を駆使することで差分も自動計算できます。

[code]

    import os
    
    file_name = "data" 
    # 下準備(テスト用ファイル作成)
    with open(file_name, "w") as f:
        f.write("a 100 200\nb 250 400\nc 600 1200")
    
    list = []
    with open(file_name, "r") as f:
        print(u"for文でリスト作成")
        for line in f:
            ss = line[:-1].split(" ")
            list.append(ss)
    
        print(u"リストのインデックスを使用する")
        size = len(list)
        for i in range(size - 1):
            c, n = list[i], list[i+1] #current, next
            print("{}-{}:{}({}-{})".format(c[0], n[0], int(n[1]) - int(c[2]), n[1], c[2]))
    
        print(u"zipでリストを回す")
        for c, n in zip(list[:-1], list[1:]):
            print("{}-{}:{}({}-{})".format(c[0], n[0], int(n[1]) - int(c[2]), n[1], c[2]))
    
    print(u"リストを空にする")
    list.clear()
    print(list)
    
    # pandasが入っていない場合はここから下を削除して実行すること
    print(u"pandasを使う")
    import pandas as pd
    
    df = pd.read_csv(file_name, header=None, delimiter="\s+")
    ct = pd.concat([df, df.shift(), df - df.shift().shift(-1, axis=1)], axis=1)
    for r in ct[1:].iterrows():
        t, v1, v2 = r[1][0], r[1][1], r[1][2]
        print("{}-{}:{}({}-{})".format(t.iat[1], t.iat[0], int(v1.iat[2]), int(v1.iat[0]), int(v2.iat[1])))
    
[/code]


CC BY-SA 4.0
2019-03-12T02:16:39.597
53374
2019-03-12T02:16:39.597
9820
53342
answer