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

Python-从素数列表中删除包含偶数的素数,python,list,loops,primes,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

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

有人能解释一下,如果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_PrimeSlim是一个生成器,它返回限制下的所有素数

如果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,这就是为什么当限制为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)

如果同一元素包含多个偶数,则代码可能会多次删除该元素。第一个这样的素数是223,这就是为什么当限制为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

如果你的素数有两个偶数,你的程序会尝试删除它两次。我会:

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

共享完整代码(包括发电机)共享完整代码(包括发电机)_primes@ggordon如果这回答了您的问题,您可能愿意接受答案。@ggordon如果这回答了您的问题,您可能愿意接受答案。