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

0 投票
2 回答
1215 浏览
提问于 2025-05-01 02:32

我需要在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 只会把值传递给 ab。而 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函数用 1030 作为参数被调用,这样它计算出 -10 + 30 = 20;所以现在 arg1 的值变成了 20。最后,lambda函数用 2040 被调用,计算出 -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

撰写回答