我发现我经常使用以下逻辑:
value
; x
; value
某种方式修改x
; 例如,value
可能是2d点,序列可能包含2d向量。
我为此编写了一个简单的函数,但我很好奇标准库中的类似物。对我来说这看起来很常见,但到目前为止我在itertools
找不到任何内容。
def iter_transform(value, sequence, transform):
yield value
for v in sequence:
value = transform(value, v)
yield value
print(list(iter_transform(10, [+3, +4, -7, -5], lambda x, y: x + y)))
输出:
[10, 13, 17, 10, 5]
更新
将值本身添加到列表中并不总是微不足道的。当然,当我们谈论数字或坐标时,总会有一个zero
,并且这种变换是一种空洞的。
但即使是value
和x
的类型也可能不同:
print(list(iter_transform('values:', [+3, +4, -7, -5], lambda x, y: x + ' ' + str(y))))
输出:
['values:', 'values: 3', 'values: 3 4', 'values: 3 4 -7', 'values: 3 4 -7 -5']
答案 0 :(得分:1)
通过组合内置reduce()
函数和列表理解的一种解决方案:
In [1]: l = [+3, +4, -7, -5]
In [2]: [reduce(lambda x, y: x + y, l[:i+1]) for i in range(len(l), 10)]
Out[2]: [10, 13, 17, 10, 5]
但这不是很有效,因为减少功能正在做太多重复的计算。
更新:另一种使用reduce()的解决方案,更有效但不那么简单。
In [1]: l = [+3, +4, -7, -5]
In [2]: result = [l[0]]
In [3]: reduce(lambda x, y: result.append(x + y) or (x + y), l, 10)
Out[3]: 5
In [4]: result
Out[4]: [10, 13, 17, 10, 5]