2016-05-16 821 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

相关问题