2016-05-16 823 views
1

我想編寫一個程序,它從素數列表中刪除包含偶數位的所有素數。Python - 從素數列表中刪除包含偶數的素數

任何人都可以解釋爲什麼這個代碼返回正確的結果,如果限制= 200,但返回一個錯誤,如果限制= 300?

def odd_primes(limit): 
    r = list(gen_primes(limit)) 
    for i in r[:]: 
     for j in str(i): 
      if int(j)%2==0: 
       r.remove(i) 
return r 

gen_primes(limit)其中gen_primes(limit)是一個發電機,它返回所有的質數在極限以下。

如果limit = 200返回:

[3, 5, 7, 11, 13, 17, 19, 31, 37, 53, 59, 71, 73, 79, 97, 113, 131, 137, 139, 151, 157, 173, 179, 191, 193, 197, 199] 

但如果限制爲300我得到這個錯誤:

line 19, in odd_primes 
r.remove(i) 
ValueError: list.remove(x): x not in list 

爲什麼會出現這種情況?我該如何糾正它?

+2

共享完整的代碼,包括gen_primes –

回答

6

如果代碼包含多個偶數位,您的代碼可能會多次刪除相同的元素。第一個這樣的主要是223,這就是爲什麼當limit是300你的代碼失敗,而不是在它的200

這是有問題的代碼:

for j in str(i): 
    if int(j)%2==0: 
     r.remove(i) 

相反,只是刪除了首要一次。例如:

for j in str(i): 
    if int(j)%2==0: 
     r.remove(i) 
     break 

或者更時髦:

if any(int(j)%2 == 0 for j in str(i)): 
    r.remove(i) 
+0

這是完全合理的,感謝解釋! – ggordon

+0

@ggordon如果這回答你的問題,你可能想接受答案。 –

2

如果你的主要有兩個偶數你的日常試圖兩次將其刪除。我會這樣做:

def odd_primes(limit): 
    r = list(gen_primes(limit)) 
    for i in r[:]: 
     for j in str(i): 
      if j in '02468': 
       r.remove(i) 
       break 
    return r 
+0

@StevenRumbalski謝謝你指出。 – Anthon

相關問題