2014-02-14 47 views
39

所以我有一個家庭作業這兩個問題,我卡在第二個。Python Set Comprehension

  1. 使用Python的集理解(Python的等價集生成符號),以生成一組的所有質數小於100召回的是一個素數是一個整數,大於1不能被除本身以外的任何整數整除,1.將一組素數存儲在一個變量中(您將需要它用於其他部分)。輸出素數集(例如,使用打印功能)。

  2. 使用Python Set Comprehension生成一組有序對(長度爲2的元組),由所有由小於100的素數組成的素數對組成。主對是一對連續的奇數,它們都是主要。將您的一組Prime對存儲在一個變量中。您的號碼1將非常有幫助。輸出你的一組Prime對。

對於第一個,這個完美的作品:

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

不過,我敢難倒第二個。我認爲我可能不得不把某個r的Cartesian產品帶上某個東西,但我不確定。

這讓我有點接近,但我只想連續配對。

cart = { (x, y) for x in r for y in r 
    if x < y } 

回答

32
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

我也限制ÿ的範圍;測試除數> 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} 

不是生成素數對並對它們進行測試,而是得到一個並查看相應的較高素數是否存在。

2

您可以生成對這樣的:

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

我不知道爲什麼你的更好的方法比較好。 OP已經有''r'中的素數小於100,因此如果r中的x + 2滿足,則{{(x,x + 2) – DSM

+1

你是對的,我誤解了他的代碼。謝謝。 – icedtrees

+1

'和x%2 == 1'沒有必要。 – thefourtheye

9

通過將適當的謂詞構建爲輔助函數,您可以獲得清晰明瞭的解決方案。換句話說,使用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)} 

注意此代碼是怎麼問題說明的直接翻譯,「 Prime對是一對連續的奇數,都是素數。「

P.S.我試圖給你正確的解決問題的技巧,但實際上並沒有給出作業問題的答案。

+1

雖然問題2可以簡化爲僅循環結果問題1,如說明中所示。 – tripleee