2016-05-16 8 views
1

Ich möchte ein Programm schreiben, das alle Primzahlen entfernt, die eine gerade Zahl aus einer Liste von Primzahlen enthalten.Python - Entfernen von Primzahlen, die eine gerade Zahl aus einer Liste von Primzahlen enthalten

Kann jemand erklären, warum dieser Code das korrekte Ergebnis zurückgibt, wenn das Limit = 200, aber einen Fehler zurückgibt, wenn das Limit = 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 

Wo gen_primes(limit) ist ein Generator, der alle Primzahlen unter Limit zurückgibt.

Wenn Limit = 200 kehrt:

[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] 

Aber wenn die Grenze 300 erhalte ich diese Fehlermeldung:

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

Warum ist dies der Fall? Und wie kann ich das korrigieren?

+2

Anteil Komplettes Code einschließlich gen_primes –

Antwort

6

Ihr Code kann das gleiche Element mehrmals entfernen, wenn es mehrere gerade Ziffern enthält. Die erste derartige Primzahl ist 223, weshalb nicht der Code, wenn limit 300 ist, aber nicht, wenn es 200.

Dies ist der säumige Code:

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

Stattdessen nur die Prime einmal entfernen. Zum Beispiel:

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

Oder vielleicht mehr stilvoll:

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

Der kompletten Sinn macht, Dank zu erklären! – ggordon

+0

@ggordon Wenn dies Ihre Frage beantwortet, möchten Sie vielleicht die Antwort akzeptieren. –

2

Wenn Ihre prime zwei geraden Zahlen Ihre Routine versucht hat es zweimal zu entfernen. Ich tun würde:

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 Danke, dass du das gezeigt hast. – Anthon