2012-10-02 58 views
3

所以我遍歷列表中的項目以這種方式:刪除元素從列表而不指數

for virus in viruses: 
    do stuff 
    remove virus 

如果我有指標,我只是做德爾病毒[i]和我能明顯調整代碼以執行諸如for index in range(0, len(viruses))之類的操作,但是這會使代碼變得很難看,因爲我想在for循環中執行其他操作。無論如何,我可以根據我目前正在迭代的病毒名稱來刪除它們嗎?

回答

5

如何:

for virus in viruses[:]: 
    # do stuff 
    viruses.remove(virus) # remove "virus" from the original list 

viruses[:]創建了我們的viruses名單的副本。作爲一個說明,你也可以使用list(oldlist)來複制列表(我發現它更具可讀性,但兩者都可以工作)。你可以閱讀更多關於python here的列表。

1

列表有一個方法remove(),使用您可以通過值刪除元素,

,如果你在它修改清單,以及迭代,那麼你應該使用reversed(),否則迭代將錯過一些元素:

for virus in reversed(viruses): 
    viruses.remove(virus) 

一個簡單的例子:

In [203]: lis=range(0,10) 

In [206]: for x in reversed(lis): 
    .....:  if x%2==0:    #remove even numbers 
    .....:   lis.remove(x) 
    .....:   
    .....:   

In [207]: lis 
Out[207]: [1, 3, 5, 7, 9] 

,或者使用一個淺拷貝:

In [212]: lis=range(10) 

In [213]: for x in lis[:]: 
    if x%2==0: 
     lis.remove(x) 
    .....:   
    .....:   

In [216]: lis 
Out[216]: [1, 3, 5, 7, 9] 
4

要由它的價值刪除一個項目只使用list.remove()

從列表中刪除元素,而你是遍歷它可能會導致一些意想不到的問題,所以一定要確保你在副本迭代:

for virus in viruses[:]: 
    # do stuff 
    viruses.remove(virus) 
1

雖然您的其中一個選項是使用remove(),但可能會返回錯誤。另一種選擇是治療病毒(這被認爲是一個列表)作爲堆棧(或隊列)

for _ in xrange(len(viruses)): 
    virus = viruses.pop() 
    # do stuff with virus 

如果viruses是不是一本字典(和virus的關鍵),則關鍵是你所需要的將其刪除:

import copy 
for virus in copy.copy(viruses): 
    # do stuff with virus 
    del viruses[virus] 

瞭解更多信息

+1

您不能更改一本字典,當你迭代它見http://docs.python.org/tutorial/datastructures.html。 'RuntimeError:迭代期間字典更改大小 ' –