我的計劃是刪除所有數字從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」。 這是爲什麼?
我的計劃是刪除所有數字從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」。 這是爲什麼?
我看到兩個可能的問題。首先,它是一個範圍,而不是實際的陣列。其次,在迭代它的同時修改列表是一個壞主意。使用列表解析來配置。
numbers = [n for n in range(0,1001) if len(str(n)) >= 2]
好點,但是,OP是使用Python 2,其中'範圍'返回一個實際的'列表'對象。如果您嘗試在Python 3範圍內調用'.remove',它會引發'AttributeError:'範圍'object has no attribute'remove'' –
當您迭代它時,您不應該更改列表或其他類型的容器。這是發生的那種錯誤。有關更多詳細信息,請參見here。
更確切地說,當您從列表中刪除當前或更早的元素,你正在轉變其向「左」。由於循環最有可能轉化爲經典的for
,因此最終會跳過左移的元素。
迭代器不知道底層列表的變化。它只是返回下一個可用的數字,這意味着在刪除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]
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]
IIRC,從列表中刪除,同時遍歷它往往會導致不良的結果。爲什麼不使用過濾列表理解? – Carcigenicate
要完成@ Carcigenicate的評論:'[我爲我在範圍內(0,1001)如果len(str(i))> = 2]' –
我試圖記住語法來發布答案:0。自從我寫了一篇以來,這段時間太長了。 – Carcigenicate