現在,我已經嘗試找出一種方法來遍歷列表並刪除當前項目。我似乎無法得到這個工作,因爲我希望它。它只循環1次,但我希望它循環2次。當我刪除去除線 - 它循環2次。從循環中的列表中刪除項目
a = [0, 1]
for i in a:
z = a
print z.remove(i)
輸出:
[1]
的輸出,我期待:
[1]
[0]
現在,我已經嘗試找出一種方法來遍歷列表並刪除當前項目。我似乎無法得到這個工作,因爲我希望它。它只循環1次,但我希望它循環2次。當我刪除去除線 - 它循環2次。從循環中的列表中刪除項目
a = [0, 1]
for i in a:
z = a
print z.remove(i)
輸出:
[1]
的輸出,我期待:
[1]
[0]
這是不好的做法,修改列表,而你通過它†循環。創建列表的副本。例如: -
oldlist = ['a', 'b', 'spam', 'c']
newlist = filter(lambda x: x != 'spam', oldlist)
†對於爲什麼這可能是不好的做法,可以考慮實施細則孰與迭代在序列的推移,當序列迭代過程中變化的依據。如果你已經刪除了當前項目,迭代器應該指向原始列表中的下一個項目還是指向修改列表中的下一個項目?如果您的決定程序取而代之將之前的(或下一個)項目移除到當前?
有些人不喜歡過濾器,與列表理解等價的東西:
newlist = [x for x in oldlist if x != 'spam']
對此方法使用列表理解而不是過濾器。 – agf
你正在改變列表,而迭代它 - 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
在循環列表時不要嘗試刪除多個列表項。我認爲這是一個通用的規則,你不僅應該遵循python,還應該遵循其他編程語言。
您可以將要刪除的項目添加到單獨的列表中。然後從原始列表中刪除新列表中的所有對象。
我不知道你爲什麼得到任何輸出。我想'z.remove(i)'會返回'None'。 – wim