繁体   English   中英

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

[英]Python - Removing primes that contain an even number from a list of primes

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

谁能解释为什么如果限制为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)是一个生成器,它返回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)

如果您的质数有两个偶数,则您的例程会尝试将其删除两次。 我会做:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM