python中的ValueError。

2024-04-24 22:11:14 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的密码:

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)

为什么?我该怎么修?你知道吗


Tags: andin密码forreturnifdef错误
2条回答

让我们输入一些打印语句,看看发生了什么:

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(第二次出现异常,因为第一次删除后它就不在了!)你知道吗

让我们看看结果:

>>> 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

相关问题 更多 >