2016-05-16 6 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)は、すべての下限を下回るジェネレータです。

制限は= 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

複数の桁が含まれていると、同じ要素が複数回削除されることがあります。まず、このような首相がlimitが300であるとき、あなたのコードが失敗した理由である、223ではなく、それは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 

それとも、もっとスタイリッシュに:たとえば、あなたの首相は2つの偶数の番号を持っている

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

関連する問題