Python计算单行运行值的总和

ale*_*nia 6 python for-loop

我尝试处理这样的数据:

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'},
            ]
Run Code Online (Sandbox Code Playgroud)

这样它就会生成一个列表,其值已更新为运行总和.现在,我使用多行循环:

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
Run Code Online (Sandbox Code Playgroud)

如何使循环单行,以便我得到:

return [{'value': somehow_incremented, 'date': element['date']} for element in some_data]
Run Code Online (Sandbox Code Playgroud)

tob*_*s_k 6

你可以自己写一个累积的生成器函数.使用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]
Run Code Online (Sandbox Code Playgroud)

结果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'}]
Run Code Online (Sandbox Code Playgroud)


Kar*_*ath 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, []))]
Run Code Online (Sandbox Code Playgroud)