Python集合の内包的


81

だから私は宿題のためにこれらの2つの問題を抱えています、そして私は2番目の問題で立ち往生しています。

  1. Python Set Comprehension(Pythonの集合の内包的記法に相当)を使用して、100未満のすべての素数のセットを生成します。素数は1より大きい整数であり、以外の整数で割り切れないことを思い出してください。それ自体と1.素数のセットを変数に格納します(追加のパーツに必要になります)。素数のセットを出力します(たとえば、印刷機能を使用)。

  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 }

回答:


69
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つを取得して、対応するより高い素数が存在するかどうかを確認します。


14

ヘルパー関数として適切な述語を作成することにより、クリーンで明確なソリューションを得ることができます。つまり、Pythonの集合の内包的記法は、通常の数学の集合の内包的記法で答えを書くのと同じ方法で使用します。

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

適切な述語が手元にあれば、問題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)}

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

PS私は、宿題の問題に対する答えを実際に与えることなく、正しい問題解決のテクニックをあなたに与えようとしています。


2
問題2は、説明に示されているように、結果の問題1をループするだけに簡略化できます。
トリプリー2014

5

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

{(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}

3
なぜあなたのより良い方法がより良いのか分かりません。OPにはすでに100未満の素数があるrので、{(x, x + 2) for x in r if x + 2 in r}十分です。
DSM

2
and x % 2 == 1必要ありません。
thefourtheye 2014

2
修正、ありがとう、何らかの理由で素数は均等になる可能性があると思いました
icedtrees 2014

2
どういうわけか、どれが欠けているのかわかりません。set([(29、31)、(59、61)、(5、7)、(71、73)、(41、43)、(3、5)、(17、19)、(11、 13)])。どのペアが欠落していますか?すでに(素数であるという)条件をrに適用しているので、コードは問題ないはずです。
icedtrees 2014

いいえ、あなたは絶対に正しいです。(7,11)や(13,17)などは、技術的には素数のリストに「連続」しているので、素数のペアに含まれているという印象を受けました。しかし今、私は理解しています。
user3308790 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.