使用Python3中的for循环遍历列表

时间:2016-02-24 02:06:03

标签: python python-3.x

有人可以解释为什么会发生以下情况吗?

>>> 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循环遍历列表中的每个元素,并删除它,留下一个空列表。为什么第一个列表最后只剩下一个元素,第二个例子似乎丢失了所有奇数?我应该怎么做呢?谢谢! :)

2 个答案:

答案 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以获得更快的流行音乐