2015-04-12 187 views
2

在python中,我遇到了list.remove方法的一個問題。這並沒有消除邏輯上必須在那裏,並且大量的塊被留在列表中。Python - list.remove迭代列表時

import os 

def removeAll(content): 
     for afile in content: 
      content.remove(afile) 
     return content 
content = removeAll(os.listdir("C:\\Windows\\System32")) 
print(content) 

但如果我不循環,除去單個內容

content.remove(content[123]) #If this string hasn't already been removed. 

它的工作。 這是爲什麼?什麼是處理巨大列表的理想選擇?

回答

3

這不是一個錯誤。請參閱Remove items from a list while iterating瞭解如何完美地完成此操作。

列表是一種可變數據類型。如果從中刪除元素,則列表的長度(以及元素的索引)將會更改。在第二個示例中,如果要在刪除前後打印內容的長度,您會看到不同之處,因爲您不假定舊索引和長度對列表有效。


考慮下面的例子就明白了更多,當這個例外發生在:

>>> content = range(4) 
>>> content 
[0, 1, 2, 3] 
>>> len(content) 
4 
>>> count = 0 
>>> length = len(content) 
>>> while count < length: 
...  print count, length, content, len(content) 
...  content.remove(content[count]) 
...  count += 1 
... 
0 4 [0, 1, 2, 3] 4 
1 4 [1, 2, 3] 3 
2 4 [1, 3] 2 
Traceback (most recent call last): 
    File "<stdin>", line 3, in <module> 
IndexError: list index out of range 

很顯然,你迭代的長度是恆定的,但數量的值被簡單地對應該列表中不存在的索引位置。


要解決一個列表的這個可變的性質,可以從列表的末尾刪除元素:

>>> content = range(4) 
>>> count = len(content) - 1 
>>> while count >= 0: 
...  print count, length, content, len(content) 
...  content.remove(content[count]) 
...  count -= 1 
... 
3 4 [0, 1, 2, 3] 4 
2 4 [0, 1, 2] 3 
1 4 [0, 1] 2 
0 4 [0] 1 
>>> print content 
[] 

或者你可以pop/remove的第一個元素始終,作爲其他的答案點。

+0

另外'計數 TigerhawkT3

+0

@mu無說明爲什麼a.remove(x)當x是一個legigment值時,不起作用 – Shane

2

您可以使用popremove來嘗試此操作。

for file in range(len(content)): 
    content.pop(0) # return 0th element in every iteration. 

for file in range(len(content)): 
    content.remove(content[0]) #just removes the oth element in every iteration 
1

如果要清空列表,切一切,什麼也沒有取代它:

content[:] = []