我尝试处理这些数据:
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'},
]
这样它就会生成一个列表,其值已更新为运行总和。现在我用多线循环来做:
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
如何使循环成为单行,以便我得到:
return [{'value': somehow_incremented, 'date': element['date']} for element in some_data]
答案 0 :(得分: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]
因此,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 :(得分: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, []))]
答案 2 :(得分:1)