这是我的代码:
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)
为什么呢?我该如何解决?
答案 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