2017-07-31 108 views
0

我已经编写了一个代码来使素数达到列表中的某个限制。 如上所示。Python,从列表中删除嵌套循环下的元素

import math 
primes = [] 
for i in range(1, 101): 
    primes.append(i) 
primes.remove(10) # Just removing for sake of experiment 
tot = math.sqrt(len(primes)) 


for j in range(2, math.ceil(tot), 1): 
    for l in range(0, len(primes)): 
     k = j**2 + l*j 
     primes.remove(k) 

primes.remove(12) # Just removing for sake of experiment 

print(primes) 

此代码在嵌套循环中删除元素时显示错误。 错误如上所示。

Traceback (most recent call last): 
    File "/root/PycharmProjects/love/love.py", line 13, in <module> 
    primes.remove(k) 
ValueError: list.remove(x): x not in list 

这究竟是为什么,因为这代码为能够删除元素,它不是在嵌套循环,但无法除去正处于嵌套循环中移除的元素。

有没有其他解决方案来解决这个问题?

回答

1

当您编辑列表时,您正在迭代列表,这是您绝对不应该做的!当你在这里重复列表:

for l in range(0, len(primes)): 

你实际上是改变len(primes)值当您删除质数!因此这会导致代码不规则地行为,如下所示:

在列表理解中,原始列表保持不变,而是创建一个新列表。 (SOURCE

相反,您可以使用列表理解来达到相同的结果!

import math 
primes = [] 
for i in range(1, 101): 
    primes.append(i) 

primeslst = [] 

def isPrime(number): 
    for i in range(2,int(number/2)+1): 
     if number%i == 0: 
      return True 
    return False 

primes = [p for p in primes if not isPrime(p)] 


print(primes) 

希望它有帮助!