web-dev-qa-db-ja.com

Python Set Comprehension

したがって、宿題の割り当てにはこれら2つの問題があり、2番目の問題にこだわっています。

  1. Python Set Comprehension(PythonのSet Builder表記に相当)を使用して、100未満のすべての素数のセットを生成します。素数は1より大きい整数であり、それ以外の整数で割り切れる、および1.プライムのセットを変数に保存します(追加の部分に必要になります)。プライムのセットを出力します(たとえば、print関数を使用)。

  2. Python Set Comprehensionを使用して、100未満の素数で構成されるすべての素数ペアで構成される順序ペア(長さ2のタプル)のセットを生成します。素数ペアは、連続する奇数のペアです。両方の素数。プライムペアのセットを変数に保存します。番号1のセットは非常に役立ちます。プライムペアのセットを出力します。

最初の場合、これは完全に機能します。

r= {x for x in range(2, 101) 
if not any(x % y == 0 for y in range(2, x))} 

ただし、2番目の方法にはかなり困惑しています。セットrのデカルト積を何かと一緒に取らなければならないかもしれないと思いますが、よくわかりません。

これにより私はある程度近づきますが、連続したペアが必要です。

cart = { (x, y) for x in r for y in r
     if x < y }
67
user3308790
primes = {x for x in range(2, 101) if all(x%y for y in range(2, min(x, 11)))}

テストを少し簡略化しました-if all(x%yの代わりにif not any(not x%y

また、yの範囲を制限しました。除数のテストには意味がありません> sqrt(x)。したがって、max(x)== 100はmax(y)== 10を意味します。x<= 10の場合、yも<xでなければなりません。

pairs = {(x, x+2) for x in primes if x+2 in primes}

素数のペアを生成してテストする代わりに、1つを取得して、対応する上位の素数が存在するかどうかを確認します。

56
Hugh Bothwell

適切な述語をヘルパー関数として作成することにより、クリーンで明確なソリューションを得ることができます。言い換えれば、通常の数学のset-notationで答えを書くのと同じ方法で、Python set-builder表記を使用してください。

セット内包の背後にある全体の考え方は、手作業で数学を行うのと同じ方法でコードを記述し、推論できるようにすることです。

適切な述部を使用すると、問題1は次のように単純化されます。

 low_primes = {x for x in range(1, 100) if is_prime(x)}

また、問題2は次のように単純化されます。

 low_prime_pairs = {(x, x+2) for x in range(1,100,2) if is_prime(x) and is_prime(x+2)}

このコードが問題仕様の直接変換であることに注意してください。「素数ペアは、両方とも素数である連続した奇数のペアです。」

追伸実際に宿題の問題に対する答えを漏らすことなく、正しい問題解決のテクニックを提供しようとしています。

13

次のようなペアを生成できます。

{(x, x + 2) for x in r if x + 2 in r}

あとは、それらを素数にする条件を取得するだけです。これは、最初の例で既に行っています。

異なる方法:(素数の大きな集合に対しては遅いですが)

{(x, y) for x in r for y in r if x + 2 == y}
4
icedtrees