[英]Python list.remove for loop “x not in list”
我正在嘗試在Python中創建一個主要的篩子。
我從制作2到2000的列表開始。我想通過檢查遍歷所有素數,並從列表中刪除所有素數的倍數。
我還沒有解決素數循環問題,但是我有一種方法可以從數字2開始,並刪除其所有倍數。
primes=list(range(2,2001))
p=2
while p<len(primes):
for x in range (p*p, len(primes), p):
primes.remove(x)
print(primes)
此版畫:[1989,1991,1993,1995,1997,1999,2000]
如您所見,數字2000仍然存在,並且應該沒有。
Traceback (most recent call last):
File "C:/Users/Are/PycharmProjects/Project Euler/10.py", line 8, in <module>
primes.remove(x)
ValueError: list.remove(x): x not in list
我的推理怎么了?
我正在使用PyCharm,是否有辦法在發生錯誤時打印x的值?
您的列表不長2000,從2開始。
>>> primes=list(range(2,2001))
>>> print len(primes)
1999
因此,當您執行while循環時,它最多不會達到2000 ... :)
您創建了1999個元素的列表:
>>> len(range(2,2001))
1999
然后,您遍歷一個range()
,但不包括該長度:
for x in range (p*p, len(primes), p):
因此, x
永遠不會大於1998。
代替len(primes)
,使用一個上限常量:
limit = 2001
primes=list(range(limit))
# ...
for x in range (p*p, limit, p):
下一個問題是while p<len(primes):
,您繼續循環 您將生成不再屬於primes
列表的數字,因此無法再次刪除它們。 您可以使用異常處理程序來捕獲異常:
try:
primes.remove(x)
except ValueError:
# already removed
pass
但您可能需要重新考慮while
循環條件。
在range(a,b)
,第一個值為a
,最后一個值為b-1
。 在您的情況下,這意味着您僅迭代len(primes)-1
,該值小於2000
。
崩潰時的x值實際上是4。在第一個循環結束時,不要將p遞增到列表中的下一個值。
其次,您嘗試多次從列表中刪除值。 您將(例如)嘗試兩次刪除12。 一次遍歷2遍,一次遍歷3遍。
最后,您要遍歷列表的長度,從列表中刪除值時,列表的長度總是越來越小。 您的第一次遍歷循環和列表大小確實很小。
重做您的代碼:
primes=list(range(2,2001))
p=2
while p<2000:
for x in range (p*p, 2001, p):
if x in primes:
primes.remove(x)
while 1:
p = p + 1
if p in primes or p > 2000:
break
print primes
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.