Python - list.remove迭代列表

时间:2015-04-12 06:08:49

标签: python arrays directory removeall

在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 个答案:

答案 0 :(得分: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

很明显,你迭代的长度是一个常量,但count的值只是对应于列表中不存在的索引位置。


要解决列表的这种可变特性,您可以从列表末尾删除元素:

>>> 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第一个元素,正如其他答案所指出的那样。

答案 1 :(得分: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

答案 2 :(得分:1)

如果要清空列表,请将所有内容切片并替换为任何内容:

content[:] = []