三条线在Python中找到一串数字中最好的产品

时间:2013-01-21 06:15:05

标签: python

完全披露:这是一项任务。简单地获取工作代码就足够了,但是在三行中这样做会让我获得额外的荣誉。

我正在尝试取一个1000位的字符串,找到连续5位数的最大乘积。你可能会认识到这是Project Euler的问题#8。

我尝试了很多选择,但我似乎陷入困境。我正在努力弄清楚我是否可以制作一个lambda声明,但我没有lambda的经验,所以它正在回避我。

这是我到目前为止所拥有的:

for i in range(1, 996):
    max = int(number[i+0]) * int(number[i+1]) * int(number[i+2]) * int(number[i+3]) * int(number[i+4]) if max < int(number[i+0]) * int(number[i+1]) * int(number[i+2]) * int(number[i+3]) * int(number[i+4]) else max = max
return max

这不起作用并触发SyntaxError: can't assign to conditional expression

我不想要直接的代码,或者至少不是一个完整的功能,而只是帮助我理解如何向前发展。

5 个答案:

答案 0 :(得分:2)

这不是合法的python:

x = y if z else x = w

这是:

x = y if z else w

这就是:

if z: x = y

顺便说一句,有一个单行解决方案,比你的三个解决方案更短更清晰。

答案 1 :(得分:1)

=在您的(很长)行中出现两次。实际上你有这个:

max = something if something else max = max

Python解析为:

max = (something if something else max) = max

而且,实际上,你不能分配一个条件表达式,这就是中间的整个事物。

你可能不打算最后有= max

答案 2 :(得分:1)

查看:

  • 内置最大功能以查找序列中的最大数字
  • 内置地图功能,将功能应用于列表中的所有元素,
  • 内置缩小功能,以便通过应用将单个对象重复返回到列表中的两个元素的函数来获取单个对象,
  • lambda定义,可以定义可以传递给map()和reduce()的函数对象,
  • 列表推导(以及非常相似的生成器)以单行编写上述功能。

答案 3 :(得分:1)

In [15]: def myinput(l,n):
    ...:     for x in l:
    ...:         yield l[x:x+n]
    ...:         

In [16]: max([reduce(lambda a,b:a*b, x) for x in myinput(range(1000),5) if len(x)==5])
Out[16]: 985084775273880L

答案 4 :(得分:1)

就像提到的递归一样,有一个简单的单线解决方案。它涉及使用max函数 - 在内置函数之后总是不好命名变量!

在Python 2中,它看起来像这样:

max(reduce(lambda x, y: x*y, map(int, num[i:i+5])) for i in xrange(996))

在Python 3 reduce已删除,因此您必须通过functools

from functools import reduce
max(reduce(lambda x, y: x*y, map(int, num[i:i+5])) for i in range(996))