2015-10-18 63 views
2

我有Python中的代碼,我試圖從列表中刪除編號爲1的所有實例。我也知道:爲什麼不刪除()實際上刪除Python列表中的重複項的最後一個實例

  1. 在遍歷它時不可能改變列表。
  2. remove()刪除列表中具有多個實例的項目的第一次出現。
my_list = [2, 3, 1, 5, 8, 4, 6, 1, 1] 
print(my_list) 

for num in my_list: 
    if num == 1: 
     my_list.remove(num) 

print(my_list) 

輸出:

[2, 3, 1, 5, 8, 4, 6, 1, 1] 
[2, 3, 5, 8, 4, 6, 1] 

考慮到我提到的兩個點,它是如何名單變化?更重要的是,爲什麼最後一個不會從列表中刪除?

+1

「在遍歷它時不可能改變列表。」這是可能的,但通常這不是明智的做法。 – Evert

+1

也許你認爲你錯誤地提到了你提到的幾點,並從那裏拿走它? – juanchopanza

+1

使用列表理解從舊列表中創建一個新列表可能會更清楚,並會刪除所有出現的「1」。 – Evert

回答

0

1. 實際上,你可以修改名單,而迭代它:

for i in range(len(my_list)-1, -1, -1): 
    if my_list[i] == 1: 
     del my_list[i] 

這是一個很好的把戲,我前一段時間看到這裏的答案在SO之一(我不記得否則我會添加一個鏈接)。通過向後迭代列表,您可以刪除鍵並仍然可以繼續迭代比剛剛刪除的索引更低的索引!

  1. 根據文檔,remove *應該只刪除第一次出現。它正在做它應該做的事!
+0

從示例中可以清楚地看到列表正在被修改。 –

+0

@BurhanKhalid你很清楚,但不是OP,請參閱問題中的第1點。 – alfasin

1

正如評論者所說,實際上對於能夠改變列表沒有限制。看看這個輸出,看看它是否有幫助。

>>> mylist = [1, 2, 3, 1, 2, 3, 1, 2, 3] 
>>> for num in mylist: 
... print(num) 
... if num == 1: 
...  mylist.remove(num) 
... 
1 
3 
1 
3 
1 
3 
>>> print(mylist) 
[2, 3, 2, 3, 2, 3] 

你看到它是如何跳過2s的嗎?它正在遍歷從索引[0]到索引[-1]的列表。當你調用remove()時,它會跳到下一個索引點。你永遠不會刪除你的例子中的1,因爲for循環已經迭代了那個索引點。