我希望编写一个解决方案来查找数值(如果存在),其值等于列表中其余连续值的总和。解决方案需要最长的序列。
例如,如果列表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让我知道是否有任何其他解决方法来实现此功能。在此先感谢您的帮助!!
答案 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
但是我会重新考虑这个算法,你当前的方法效率不高,因为你对循环的每次迭代执行基本相同的求和。更好的方法是提前计算总和,然后检查列表中是否存在任何这些总和。当然,像这样的小清单并不重要。