2016-05-16 2 views
1

Я хочу написать программу, которая удаляет все простые числа, содержащие четную цифру из списка простых чисел.Python - Удаление простых чисел, содержащих четное число из списка простых чисел

Может ли кто-нибудь объяснить, почему этот код возвращает правильный результат, если limit = 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

Ваш код может удалять один и тот же элемент несколько раз, если он содержит несколько четных цифр. Первый такой премьер является 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

Смежные вопросы