2011-08-29 80 views
1

現在,我已經嘗試找出一種方法來遍歷列表並刪除當前項目。我似乎無法得到這個工作,因爲我希望它。它只循環1次,但我希望它循環2次。當我刪除去除線 - 它循環2次。從循環中的列表中刪除項目

a = [0, 1] 
for i in a: 
    z = a 
    print z.remove(i) 

輸出:

[1] 

的輸出,我期待:

[1] 
[0] 
+0

我不知道你爲什麼得到任何輸出。我想'z.remove(i)'會返回'None'。 – wim

回答

3

這是不好的做法,修改列表,而你通過它循環。創建列表的副本。例如: -

oldlist = ['a', 'b', 'spam', 'c'] 
newlist = filter(lambda x: x != 'spam', oldlist) 

†對於爲什麼這可能是不好的做法,可以考慮實施細則孰與迭代在序列的推移,當序列迭代過程中變化的依據。如果你已經刪除了當前項目,迭代器應該指向原始列表中的下一個項目還是指向修改列表中的下一個項目?如果您的決定程序取而代之將之前的(或下一個)項目移除到當前?


有些人不喜歡過濾器,與列表理解等價的東西:

newlist = [x for x in oldlist if x != 'spam'] 
+0

對此方法使用列表理解而不是過濾器。 – agf

2

的問題是,您要修改aremove所以退出循環,因爲該指數已經過它的結束。

+0

那他應該怎麼做呢? – agf

+0

我不是一個蟒蛇人,所以我不得不查找語法,但我假設你可以做'while remove'或'while pop'? –

+0

我知道,我只是說你沒有真正回答這個問題,因爲你沒有告訴他如何去做。 – agf

8

你正在改變列表,而迭代它 - z = a不會複製,它只是指向z在同一地點a點。

嘗試

for i in a[:]:   # slicing a list makes a copy 
    print i    # remove doesn't return the item so print it here 
    a.remove(i)   # remove the item from the original list 

while a:    # while the list is not empty 
    print a.pop(0)  # remove the first item from the list 

如果你不需要外在的循環,你可以刪除一個列表理解與條件匹配的項目:

a = [i for i in a if i] # remove all items that evaluate to false 
a = [i for i in a if condition(i)] # remove items where the condition is False 
+0

現在的輸出是「None None」 – MJA

+0

'remove'不會返回任何內容,因此它會打印'None'。如果您想在刪除它之前打印該項目,只需執行'print i'然後'a.remove(i)'。 'pop'版本實際上會返回給定索引處的項目,所以它會'打印'該項目。編輯我的答案來反映這一點。 – agf

1

在循環列表時不要嘗試刪除多個列表項。我認爲這是一個通用的規則,你不僅應該遵循python,還應該遵循其他編程語言。

您可以將要刪除的項目添加到單獨的列表中。然後從原始列表中刪除新列表中的所有對象。