2016-02-24 8 views
6

1行の値の実行中の合計を計算:Pythonは、私は、このようなデータを処理しようと

some_data = [ 
       {'value': 2, 'date':'2016-02-06'}, 
       {'value': 1, 'date':'2016-02-07'}, 
       {'value': 5, 'date':'2016-02-08'}, 
       {'value': 3, 'date':'2016-02-09'}, 
       {'value': 1, 'date':'2016-02-10'}, 
      ] 

それが実行中の合計になるように更新された値のリストを生成するように。

return [{'value': somehow_incremented, 'date': element['date']} for element in some_data] 
+0

希望の出力は何ですか?あなたは現在何を得ていますか? –

+1

@ nathan.meadows:もう一度質問を読んでください。 –

+0

forループに2行あり、1行が必要です。私は正しく理解しましたか? – AlokThakur

答えて

3

である私はあなたのコードが罰金で、をやってお勧めしません。読めるようにしてください。

def values_incremented(some_data): 
    return [{'value': current_sum, 'date': element['date']} 
     for element, current_sum 
     in zip(some_data, 
      reduce(lambda x, y: [y['value']] if not x else x + [x[-1] + y['value']], some_data, []))] 
+0

これは真の1ライナーです:)ありがとう:)もちろん、元のコードははるかに読みやすくなります。私が意図したことは、 'temp_sum = 0'や' result = [] 'のような余分な宣言を減らすことでした。 – alekwisnia

+0

ええ、ローリングサムを計算するのは面倒です。ちょうどそれを見て...それらのどれもきれいにインラインに見えません:http://stackoverflow.com/questions/3432830/list-comprehension-for-running-totalあなたがそれを抽出したら、元のコード。 –

6

あなたは自分自身に蓄積ジェネレータ関数を書くことができ:私が得たように、ループワンライナーにする方法

def values_incremented(some_data): 
    temp_sum = 0 
    result = [] 
    for element in some_data: 
     temp_sum += element['value'] 
     result.append({'value': temp_sum, 'date': element['date']}) 
    return result 

:今、私は複数行のループでそれを行います。 sendを使用してジェネレータに値を送信し、新しい合計を取得します。その結果、

def accumulator(n=0): 
    while True: 
     n += yield n 

acc = accumulator(0) 
acc.send(None) 

res = [{'value': acc.send(element['value']), 'date': element['date']} for element in some_data] 

res

[{'value': 2, 'date': '2016-02-06'}, 
{'value': 3, 'date': '2016-02-07'}, 
{'value': 8, 'date': '2016-02-08'}, 
{'value': 11, 'date': '2016-02-09'}, 
{'value': 12, 'date': '2016-02-10'}] 
+1

これは素晴らしいことです:-)そのために+1 ...しかし、私は単純なforループはかなり読みやすいと思います。 –

1

ここでは線形時間で実行される1つのライナーです:

reduce(lambda (c,s), a: (c + [{'value':s+a['value'], 'date':a['date']}], s+a['value']), some_data,([],0))[0] 

>>> [{'date': '2016-02-06', 'value': 2}, 
    {'date': '2016-02-07', 'value': 3}, 
    {'date': '2016-02-08', 'value': 8}, 
    {'date': '2016-02-09', 'value': 11}, 
    {'date': '2016-02-10', 'value': 12}] 

あなたが同じ問題の簡単なバージョンのためother running total questionを確認する必要があります言われて、ここでのアプローチだと

関連する問題