使用lambda在Python中交替的整数和

时间:2014-11-02 04:14:50

标签: 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 个答案:

答案 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。然后,使用参数1030调用lambda,使其计算-10 + 30 = 20;所以现在arg1取值20。最后,使用2040调用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只将值传递给ab。创建函数时,c仅为循环分配一次