Skip to main content
 首页 » 编程设计

Python之从素数列表中删除包含偶数的素数

2025年05月04日10bjzhanghao

我想编写一个程序,从素数列表中删除所有包含偶数位的素数。

谁能解释为什么这段代码在 limit = 200 时返回正确结果,而在 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 

其中 gen_primes(limit) 是一个生成器,它返回 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 

为什么会这样?我该如何纠正它?

请您参考如下方法:

如果同一元素包含多个偶数位,您的代码可能会多次删除同一元素。第一个这样的质数是 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)