为什么list.remove只删除每一秒项?

时间:2013-05-09 15:02:54

标签: python list enumeration

在我的Python 2.7.2 IDLE解释器中:

>>> mylist = [1, 2, 3, 4, 5]
>>> for item in mylist:
        mylist.remove(item)

>>> mylist
[2, 4]

为什么?

6 个答案:

答案 0 :(得分:4)

这是因为当您遍历列表时python keeps track of the index in the list。请考虑以下代码:

for i in range(len(mylist)):
    if i >= len(mylist):
       break
    item = mylist[i]
    mylist.remove(item)

如果我们跟踪这个(这实际上是python在你的代码中做了什么),那么我们看到当我们删除列表中的项目时,右边的数字向左移动一个位置以填充剩下的空白我们删除了该项目。正确的项目现在位于索引i,因此在迭代中永远不会看到它,因为接下来发生的事情是我们为for循环的下一次迭代增加i


现在有点聪明。相反,如果我们向后遍历列表,我们将清除列表:

for item in reversed(mylist):
    mylist.remove(item)

这里的原因是我们在for循环的每次迭代中都将一个项目从列表的末尾开始。由于我们总是把项目放在最后,所以不需要转移(假设列表中的唯一性 - 如果列表不是唯一的,结果是相同的,但参数变得有点复杂)。

当然,如果您要从列表中删除所有项目,您可以非常轻松地执行此操作:

del mylist[:]

或甚至使用切片分配:

mylist[:] = []

(我提到了后者,因为将列表的片段替换为甚至不需要相同长度的其他项目会很有用。)

答案 1 :(得分:3)

那是因为你在迭代它时修改列表,而是迭代浅拷贝:

>>> mylist = [1, 2, 3, 4, 5]
>>> for item in mylist[:]:      #use mylist[:] or list(mylist)
            mylist.remove(item)
...     
>>> mylist
[]

答案 2 :(得分:2)

您在循环浏览时正在修改列表,这是非常糟糕的做法。

答案 3 :(得分:2)

问题是你在迭代它时改变列表。改为使用列表理解:

mylist = [1, 2, 3, 4, 5]
mylist = [x for x in mylist if condition(x)]

答案 4 :(得分:0)

>>> mylist = [1, 2, 3, 4, 5]

>>> for item in mylist:
        mylist.remove(item)

在这个循环中:      第一次将第0个元素(1)作为项目并将其从mylist.so中移除后,该mylist将为[2,3,4,5],但指针将位于新mylist的第1个元素中[(2) ,3,4,5])即3.它将删除3.so 2将不会从列表中删除。

这就是为什么在完全操作[2,4]之后会留下的。

using for loop:-
>>>for i in range(len(mylist)):
       mylist.remove(mylist[0])
       i-=1

>>>mylist
[]

您可以使用while循环执行此操作:

>>>mylist = [1, 2, 3, 4, 5]
>>>while (len(mylist)>0):
       mylist.remove(mylist[0])
       print mylist

答案 5 :(得分:0)

使用mylist

的深层副本
mylist = [1, 2, 3, 4, 5]

l = [k for k in mylist] # deep copy

for i in range(len(mylist)):
    mylist.remove(l[i])
    print 

print mylist