簡體   English   中英

Python list.remove for循環“ x not in list”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM