python中的ValueError。

时间:2013-09-03 05:27:27

标签: python primes

这是我的代码:

def f(x): return x%2!=0 and x%3!=0

primes = filter(f , range (6,50))

for x in primes:
    for a in filter(f, range(2,x-1)):       
      if x%a == 0:
        primes.remove(x);

print(primes)

我收到此错误:

File "primes.py", line 12, in <module>
    primes.remove(x);
ValueError: list.remove(x): x not in list

但有趣的是,如果我这样写:

def f(x): return x%2!=0 and x%3
primes = filter(f , range (6,20))

for x in primes:
    for a in filter(f, range(2,x-1)): 

            if x%a == 0:
                primes.remove(x);

print(primes)

为什么呢?我该如何解决?

2 个答案:

答案 0 :(得分:1)

让我们在一些印刷品陈述中看看发生了什么:

In [81]: %paste
def f(x): return x%2!=0 and x%3!=0

primes = filter(f , range (6,50))
print primes

for x in primes:
    for a in filter(f, range(2,x-1)):
      if x%a == 0:
        print x
        primes.remove(x);

print(primes)

## -- End pasted text --
[7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49]
25
35
35

所以你的问题是你已经两次产生数字35(并且你第二次得到例外,因为它在你第一次删除它之后不存在!)

答案 1 :(得分:0)

让我们看一下结果:

>>> primes = filter(f , range (6,50))
>>> primes
[7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49]

这里你的值是35,即5 * 7。在嵌套循环中,当a为5时,条件得到满足,并且从primes列表中删除35;当a转到7时,再次满足条件,但此时35已被删除,因此引发异常。

所以一个简单的修复就像下面的那个。这样,x只在首次满足条件时被删除一次:

for x in primes:
    for a in filter(f, range(2,x-1)):
        if x%a == 0:
            primes.remove(x)
            break

但现在它会在非素数之后跳过元素,例如此列表中的95:

primes=[7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49, 53, 55, 59, 61, 65, 67, 71, 73, 77, 79, 83, 85, 89, 91, 95, 97]

通过制作primes切片来修复:

for x in primes[:]:
    for a in filter(f, range(2,x-1)):
        if x%a == 0:
            primes.remove(x)
            break