2017-07-31 106 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) 

希望它有幫助!