这是我在尝试学习 python 编程时遇到的最常见问题。问题是,当我尝试使用“range()”函数迭代列表以检查列表中的给定项目是否满足给定条件,如果满足则删除它,它总是会给出“IndexError”。那么,是否有一种特殊的方法可以在不使用任何其他中间列表或“while”语句的情况下执行此操作?下面是一个例子:
l = range(20)
for i in range(0,len(l)):
if l[i] == something:
l.pop(i)
首先,你永远不想在 Python 中迭代类似的事情。迭代实际对象,而不是索引:
l = range(20)
for i in l:
...
错误的原因是您正在删除一个项目,因此后面的索引不再存在。
现在,您无法在循环遍历列表时修改列表,但这不是问题。更好的解决方案是使用列表理解 https://www.youtube.com/watch?v=t85uBptTDYY在这里,过滤掉多余的项目。
l = range(20)
new_l = [i for i in l if not i == something]
您还可以使用the filter() builtin http://docs.python.org/library/functions.html#filter,尽管在大多数情况下这往往不清楚(并且在您需要的地方速度较慢)lambda
).
另请注意,在 Python 3.x 中,range()
产生一个生成器,而不是一个列表。
使用更具描述性的变量名称也是一个好主意 - 我假设这里是例如,但是像这样的名称i
and l
难以阅读并且更容易引入错误。
Edit:
如果您希望就地更新现有列表,如注释中所指出的,您可以使用切片语法依次替换列表中的每个项目(l[:] = new_l
)。也就是说,我认为这种情况的设计非常糟糕。您不希望一段代码依赖于以这种方式从另一段代码更新的数据。
Edit 2:
如果出于任何原因,您在循环项目时需要索引,那就是the enumerate() builtin http://docs.python.org/library/functions.html#enumerate is for.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)