这是我在尝试学习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)
首先,你永远不想在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()内置的是.
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |