Python在onelin中计算运行值之和

2024-04-20 14:10:12 发布

您现在位置: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'},
            ]

所以它会生成一个列表,其中的值更新为一个连续的和。现在我用一个多行循环来完成:

^{pr2}$

如何使循环成为一条直线,因此我得到:

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

Tags: 数据in列表fordatadatereturnvalue
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, []))]

这里有一个在线性时间内运行的单行线:

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中相同问题的更简单版本。在

你可以给自己写一个累加生成函数。使用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

^{pr2}$

相关问题 更多 >