-2

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

我正在尝试获取 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

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

4

5 回答 5

2

这不是合法的蟒蛇:

x = y if z else x = w

这是:

x = y if z else w

这是这样的:

if z: x = y

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

于 2013-01-21T06:18:34.100 回答
1

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

max = something if something else max = max

Python解析为:

max = (something if something else max) = max

而且,确实,您不能分配给条件表达式,这就是中间的全部内容。

你可能不打算在最后进行决赛= max

于 2013-01-21T06:19:24.473 回答
1

调查:

  • 用于查找序列中最大数的内置 max 函数,
  • 内置 map 函数将函数应用于列表中的所有元素,
  • 内置reduce函数通过将重复返回单个对象的函数应用于列表中的两个元素来获取单个对象,
  • lambda 定义能够定义您可以传递给 map() 和 reduce() 的函数对象,
  • 列表推导(和生成器,它们非常相似)以单行方式组合上述函数。
于 2013-01-21T06:33:36.707 回答
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
于 2013-01-21T06:38:38.520 回答
1

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

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

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

在 Python 3reduce中被删除了,所以你必须通过它functools

from functools import reduce
max(reduce(lambda x, y: x*y, map(int, num[i:i+5])) for i in range(996))
于 2013-01-21T06:39:43.417 回答