【问题标题】:Python - Removing primes that contain an even number from a list of primesPython - 从素数列表中删除包含偶数的素数
【发布时间】:2016-09-12 08:11:31
【问题描述】:

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

谁能解释一下为什么这个代码在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

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

【问题讨论】:

  • 分享完整的代码,包括gen_primes

标签: python list loops primes


【解决方案1】:

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

【讨论】:

  • @ggordon 如果这回答了您的问题,您可能愿意接受答案。
【解决方案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

【讨论】:

    猜你喜欢
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 2022-12-06
    • 2015-09-14
    相关资源
    最近更新 更多