1

ラムダ関数を使用して、Pythonで2,000,000未満のすべての素数の合計を取得しようとしています。(私はそれをブルートフォースしましたが、それは非常に時間がかかり、より良い解決策が必要です。)これまでのところ、これが私が持っているものです:

def isPrime(n):
    for x in range(2, int(n**0.5)+1):
        if n%x==0: return False
    return True


print reduce(lambda x: isPrime(x), [range(200)])

さて、これは1から200まで増加する数値を出力するだけなので、reduceが機能しているとは思わない= \

誰かヒントはありますか?

4

2 に答える 2

2

あなたのコードで起こっているいくつかの奇妙なことがあります。

  • filter()ではなく、実際に使いたいと思いますreduce()
  • lambda x: isPrime(x)と同等ですisPrime(結局のところ、isPrimeはすでにの結果を返す関数ですisPrime)。
  • [range(200)]ネストされたリストを作成します。外側のリストの唯一の要素は、0から200までの数字のリストです。単一のリストが必要だと思います。

したがって、次のことを試してください。

print filter(isPrime, range(200))
于 2013-03-14T22:44:21.013 に答える
2

ここには多くの間違いがあります。lambda x: isPrime(x)1つ目は、単純にに置き換えることができるということですisPrime。関数はPythonのファーストクラスです。つまり、整数や文字列と同じ方法で関数を渡すことができます。2つ目は、リストのリストを渡すことです。[range(200)]範囲の戻り値を含むリストはリストをrange(200)返すため、1つの値のみを減らしています。これは3番目の問題を回避します。reduceはアイテムのペアに渡される関数を時間として呼び出すため、reduce関数は2つの引数を受け入れる必要があります。そのままでは、アイテムが1つしかないため、関数は0回呼び出され、リストの最初のアイテムが返されます。

私があなたがしたいと思うのはリストをフィルタリングすることです、あなたはこれをするためにfilter関数を使うことができます、あるいはあなたはこのように見えるリスト内包を使うことができます:

[x for x in range(200) if isPrime(x)]
于 2013-03-14T22:46:35.603 に答える