Python:在reduce()中处理2个以上的参数

时间:2014-03-10 23:19:44

标签: python string python-2.7

我希望编写一个解决方案来查找数值(如果存在),其值等于列表中其余连续值的总和。解决方案需要最长的序列。

例如,如果列表a

a = [1,2,3,4,5,6,7]

结果应为6 6=1+2+3,因为它是可用的最长序列。

我编写了如下代码,但是它引发了一个错误并且是Python新手我正在解决如何处理它。

代码:

for i in s[::-1]:
    sum = reduce(lambda x,y:x+y if (x+y)<i,a)
    if sum==i:
        print sum
        break

错误:

print reduce(lambda x,y: x+y if (x+y)<i,a)
                                         ^
SyntaxError: invalid syntax

我试图让reduce()函数在遇到(x+y)>=i时停止执行。我试过了sum = reduce(lambda x,y:x+y if (x+y)<i else 0,a)但是如果条件失败则只返回0。如果条件失败直到到达列表末尾(在reduce()函数中),有没有办法将0添加到总和中。)

Plz让我知道是否有任何其他解决方法来实现此功能。在此先感谢您的帮助!!

3 个答案:

答案 0 :(得分:1)

您无需将i传递给lambda,因为它已经在范围内。

答案 1 :(得分:0)

编写else表达式时,必须放置if。我不确定你要解决的是什么,但解决方案可能是

sum = reduce(lambda x,y:x+y if (x+y)<i else 0, a)

sum = reduce(lambda x,y:x+y if (x+y)<i else x, a)

答案 2 :(得分:0)

这是无效的语法,因为x+y if (x+y)<i不是表达式。 <expression> if <condition>之类的唯一有效时间是在理解或生成器表达式中。

您似乎试图让reduce()执行停止在某一点,这不能直接完成,但可以通过lambda返回x进行模拟

为此,您将使用条件表达式,其具有以下语法:
 <if-true> if <condition> else <if-false>

除了此更改之外,您还需要从i中删除lambda参数,因为传递给reduce的函数只会传递两个参数。

最后,我认为您需要以下内容:

s = reduce(lambda x, y: x+y if (x+y) <= i else x, a)

例如:

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> i = 6
>>> s = reduce(lambda x, y: x+y if (x+y) <= i else x, a)
>>> s
6

但是我会重新考虑这个算法,你当前的方法效率不高,因为你对循环的每次迭代执行基本相同的求和。更好的方法是提前计算总和,然后检查列表中是否存在任何这些总和。当然,像这样的小清单并不重要。