如何使用range()函数从列表中删除项目时迭代列表?

Ali*_*rld 3 python

这是我在尝试学习python编程时遇到的最常见问题.问题是,当我尝试使用"range()"函数迭代列表来检查列表中的给定项是否满足给定条件,如果是,则删除它,它将始终给出"IndexError".那么,有没有一种特殊的方法可以在不使用任何其他中间列表或"while"语句的情况下执行此操作?以下是一个例子:

l = range(20)
for i in range(0,len(l)):
  if l[i] == something:
    l.pop(i)
Run Code Online (Sandbox Code Playgroud)

Gar*_*tty 7

首先,你永远不想在Python中迭代这样的事情.迭代实际对象,而不是索引:

l = range(20)
for i in l:
    ...
Run Code Online (Sandbox Code Playgroud)

您的错误的原因是您正在删除一个项目,因此后面的索引不再存在.

现在,您在循环时无法修改列表,但这不是问题.更好的解决方案是在此处使用列表推导来过滤掉额外的项目.

l = range(20)
new_l = [i for i in l if not i == something]
Run Code Online (Sandbox Code Playgroud)

您还可以使用filter()内置,尽管这往往是在大多数情况下不清楚(速度较慢,你需要lambda).

另请注意,在Python 3.x中,range()生成生成器,而不是列表.

使用更具描述性的变量名称也是一个好主意 - 我在这里假设它是例如,但名称喜欢i并且l难以阅读并且更容易引入错误.

编辑:

如果您希望按照注释中的指示更新现有列表,则可以使用切片语法依次替换列表中的每个项目(l[:] = new_l).那就是说,我认为那个案子的设计很糟糕.您不希望一段代码依赖于以这种方式从另一位代码更新的数据.

编辑2:

如果出于任何原因,你需要的指数,你遍历所有的项目,这就是enumerate()内置的是.