Python - 从素数列表

时间:2016-05-16 13:51:09

标签: python list loops primes

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

如果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 = 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 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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