在Python中使用lambda计算整数的交替和
我需要在Python中写一个简单的函数,来计算一组整数的交替和。
举个例子:如果有一个列表 [ a1, a2, a3, ...],那么计算结果应该是 [a1 - a2 + a3 - a4...]。
我需要用一个lambda函数来实现这个功能。
到目前为止,我写的代码是:
print reduce(lambda a,b : ((-a) + b), [10, 20, 30, 40])
这段代码输出的是20,但我希望它输出-20。
我哪里做错了呢?
2 个回答
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
只在函数创建的时候被赋值一次,代表这个循环。
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
。接着,你的lambda函数用 10
和 30
作为参数被调用,这样它计算出 -10 + 30 = 20
;所以现在 arg1
的值变成了 20
。最后,lambda函数用 20
和 40
被调用,计算出 -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