-2

完全な開示: これは割り当て用です。動作するコードを取得するだけで十分ですが、これを 3 行で実行すると、さらに評価が高まります。

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

これは正当な python ではありません:

x = y if z else x = w

これは:

x = y if z else w

これもそうです:

if z: x = y

ところで、3 行よりもはるかに短くてわかりやすい 1 行のソリューションがあります。

于 2013-01-21T06:18:34.100 に答える
1

=(非常に長い) 行に 2 回表示されます。事実上、これがあります:

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 関数、
  • 単一のオブジェクトを繰り返し返す関数をリスト内の 2 つの要素に適用した結果として単一のオブジェクトを取得する組み込みの reduce 関数、
  • 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 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))
于 2013-01-21T06:39:43.417 に答える