您 能够 em> 以列表理解方式这样做, 但从您请求的具体条件来看, 这对我来说更像是生成器的工作。 这是一个非常普遍的解决方案, 应该同时使用序列和迭代器。 它在传递给它的可使用性上, 运行相当于 Haskell s < code> scanl code > 的函数, 其初始值作为最后的参数, 可选的初始值 。
第一个参数应该是一个函数,它需要两个参数 -- -- 当前累积状态和序列中的下一个项 -- -- 并返回下一个累积状态。它可能像 operator.add
或更复杂的东西一样简单。
>>> def scan(f, seq, init=None):
... seq = iter(seq)
... state = seq.next() if init is None else init
... yield state
... for i in seq:
... state = f(state, i)
... yield state
累计总和(即三角数字):
>>> import operator
>>> list(scan(operator.add, range(10)))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
以不同的初始值开始 :
>>> list(scan(operator.add, range(1, 10), 10))
[10, 11, 13, 16, 20, 25, 31, 38, 46, 55]
适用于您的问题 :
>>> diffs = [(1, 0), (-1, 1), (1, 3), (1, 3), (-1, 5), (1, 9)]
>>> list(scan(lambda x, y: (x[0] + y[0], y[1]), diffs))
[(1, 0), (0, 1), (1, 3), (2, 3), (1, 5), (2, 9)]
最初价值不同 只是为了取乐
>>> list(scan(lambda x, y: (x[0] + y[0], y[1]), diffs, (5, -1)))
[(5, -1), (6, 0), (5, 1), (6, 3), (7, 3), (6, 5), (7, 9)]