我需要在Python中编写一个简单的函数来计算整数列表的交替和。
示例:[a1,a2,a3,...]将是[a1 - a2 + a3 - a4 ...]
我需要使用lambda函数来实现它。
到目前为止我已经
了print reduce(lambda a,b : ((-a) + b), [10, 20, 30, 40])
打印出20;但它应该打印-20。
我做错了什么?
答案 0 :(得分:2)
对于lambda函数,reduce
的工作方式如下:
def myReduce(f, L):
arg1 = L[0]
for arg2 in L[1:]:
arg1 = f(arg1, arg2)
return arg1
正如您所看到的,这将每次都否定运行总计:
在第一次迭代中,它计算-10 + 20 = 10
,然后将其存储为arg1
。然后,使用参数10
和30
调用lambda,使其计算-10 + 30 = 20
;所以现在arg1
取值20
。最后,使用20
和40
调用lambda,使其计算-20 + 40 = 20
。
看到问题了?
有几种方法可以解决这个问题。以下是一些:
L = [10, 20, 30, 40]
sum(map(lambda t : t[0]-t[1], zip(L[::2], L[1::2])))
或
answer = 0
for i,elem in enumerate(L):
mult = [1,-1][i%2]
answer += elem * mult
或
mults = itertools.cycle([1,-1])
answer = 0
for elem, mult in zip(L, mults):
answer += elem, mult
答案 1 :(得分:1)
可以将循环包含在这样的lambda中
>>> from itertools import cycle
>>> reduce(lambda a, b, c=cycle((-1, 1)) : a + next(c) * b, [10, 20, 30, 40])
-20
这里的诀窍是reduce
只将值传递给a
和b
。创建函数时,c
仅为循环分配一次