Python - 从素数列表中删除包含偶数的素数
Python - Removing primes that contain an even number from a list of primes
我想编写一个程序,从素数列表中删除所有包含偶数位的素数。
谁能解释为什么如果限制 = 200,此代码 returns 结果正确,但如果限制 = 300,则 returns 错误?
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)
是一个生成器,它 returns 限制所有素数。
如果limit = 200它returns:
[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
我想编写一个程序,从素数列表中删除所有包含偶数位的素数。
谁能解释为什么如果限制 = 200,此代码 returns 结果正确,但如果限制 = 300,则 returns 错误?
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)
是一个生成器,它 returns 限制所有素数。
如果limit = 200它returns:
[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