0

我有四个数字的列表:

mylist=[3,5,67,4]

我想删除所有奇数。所以,我写了以下内容:

for item in mylist:
  if item%2==1:
    mylist.remove(item)

当我打印mylist时,我得到以下信息:

[5,4]

我无法弄清楚为什么会这样。但是,当我在语句之后添加打印语句时,if我得到了正确的答案:

for item in mylist:
  if item%2==1:
    mylist.remove(item)
  print mylist

产生:

[4]

这里发生了什么?我错过了什么?

4

3 回答 3

5

在迭代列表时就地修改列表是个坏主意。随着列表在您迭代时发生变化,您的迭代会继续进行,就好像列表没有改变一样 - 产生奇怪的结果。

最好的解决方案是构建一个新列表 - 最好使用列表理解

mylist = [item for item in mylist if item % 2 == 0]

如果您必须修改列表,您可以在之后重新分配值 ( mylist[:] = ...),但您不太可能需要就地修改它。

这也具有可读性和简洁性的优点。

于 2013-06-04T00:09:14.370 回答
3

您需要遍历列表的副本。直接在循环中修改列表是导致您遇到问题的原因。这是执行此操作的首选方法:

for item in mylist[:]:
    if item%2==1:
        mylist.remove(item)
于 2013-06-04T00:07:54.153 回答
0

我同意其他答案,即迭代列表并在循环中修改该列表是不安全的。我为此类问题找到的一种解决方案 - 特别是从列表中删除 - 是使用索引而不是迭代器向后循环。

我的 python 代码生锈了,所以我将使用类似 C 的伪代码来代替......

for ( i = lastindex; i >= 0; --i )
  if ( some condition involving list[i] )
    remove item at index i

这在从列表中删除时有效,因为删除后移动的项目是您已经查看过的项目;您的i索引仍然有效,您尚未评估的所有项目也是如此!

于 2013-06-04T01:02:40.993 回答