2017-08-19 60 views
0

我的計劃是刪除所有數字從0到1000,少於兩位數字。 我這樣做:爲什麼不從我的數組中刪除這些數字?

numbers = range(0,1001) 
#check for two or more digits 
for number in numbers: 
    if len(str(number)) < 2: 
     numbers.remove(number) 

當我再查我的陣列,它仍包含這些數字 「1,3,5,7,9」。 這是爲什麼?

+1

IIRC,從列表中刪除,同時遍歷它往往會導致不良的結果。爲什麼不使用過濾列表理解? – Carcigenicate

+0

要完成@ Carcigenicate的評論:'[我爲我在範圍內(0,1001)如果len(str(i))> = 2]' –

+0

我試圖記住語法來發布答案:0。自從我寫了一篇以來,這段時間太長了。 – Carcigenicate

回答

1

我看到兩個可能的問題。首先,它是一個範圍,而不是實際的陣列。其次,在迭代它的同時修改列表是一個壞主意。使用列表解析來配置。

numbers = [n for n in range(0,1001) if len(str(n)) >= 2] 
+1

好點,但是,OP是使用Python 2,其中'範圍'返回一個實際的'列表'對象。如果您嘗試在Python 3範圍內調用'.remove',它會引發'AttributeError:'範圍'object has no attribute'remove'' –

2

當您迭代它時,您不應該更改列表或其他類型的容器。這是發生的那種錯誤。有關更多詳細信息,請參見here


更確切地說,當您從列表中刪除當前或更早的元素,你正在轉變其向「左」。由於循環最有可能轉化爲經典的for,因此最終會跳過左移的元素。

2

迭代器不知道底層列表的變化。它只是返回下一個可用的數字,這意味着在刪除0之後,迭代器當前指向1,因此產生2作爲下一個要檢查的值。簡短的回答是:不會修改您正在迭代的列表。

相反,要包含要值一個新的列表保持

numbers = range(0, 1001) 
new_numbers = [] 
for number in numbers: 
    if len(str(number)) >= 2: 
     new_numbers.append(number) 

numbers = new_numbers 

更簡單地說,使用列表理解:

numbers = [x for x in numbers if len(str(x)) >= 2] 
0

for循環剛剛生成的索引迭代列表。你正在修改循環內的列表,所以它不會給出正確的結果。

比方說你有LEN列表= 10

numbers = [0,1,2,3,4,5,6,7,8,9] 

並運行這個循環在第一次迭代

for number in numbers: 
    if number < 2: 
     numbers.remove(number) 

,該指數爲0,號碼爲[0,它將刪除數字[0] = 0

在第二次迭代中索引將爲1,數字列表將爲[1 ,2,3,4,5,6,7,8,9],因爲我們刪除了最後一個l上的第一個元素現在它會刪除數字[1] = 2

等等。做你想做什麼

最好的辦法是使用列表comprehesion:

numbers = [x for x in numbers if len(str(number)) > 2] 
相關問題