有人可以解释为什么会发生以下情况吗?
>>> ls = ['a', 'b']
>>> for i in ls:
... ls.remove(i)
...
>>> ls
['b']
>>> ls = [1, 2, 3, 4, 5]
>>> for i in ls:
... ls.remove(i)
...
>>> ls
[2, 4]
我希望for循环遍历列表中的每个元素,并删除它,留下一个空列表。为什么第一个列表最后只剩下一个元素,第二个例子似乎丢失了所有奇数?我应该怎么做呢?谢谢! :)
答案 0 :(得分:1)
让我们看看第二个例子,它更容易看到发生了什么。
1
[2, 3, 4, 5]
3
[2, 4, 5]
5
[2, 4]
要注意的是,在每次迭代中,您都没有获得列表的n
元素,就像它在过去之前一样,在循环开始之前;你正在获得数组的第n
个元素。
第一个例子是相同的,只是提前停止。
清除列表的Pythonic方法:
del ls[:]
编辑:要有条件地删除元素,最Pythonic的方法是创建一个新的过滤列表:
filtered_ls = [x for x in ls if okay(x)]
如果您不想丢失对旧列表的引用,可以执行以下操作:
filtered_ls[:] = [x for x in ls if okay(x)]
最后,你也可以从后面迭代;这样,既然你总是在处理最后一个元素,那么移除它并不会搞砸列表。
答案 1 :(得分:0)
如果您想逐项循环列表并删除它们,请使用while
循环:
>>> ls=['a', 'b', 'c']
>>> while ls:
... e=ls.pop()
... print e
...
c
b
a
>>> ls
[]
如果您希望这样做有效,请使用deque以获得更快的流行音乐