IndexError的原因?

时间:2015-06-07 07:58:52

标签: python list

我有一个列表tmp=['Name','Date',' ','-','MO.A2.v05.005',.... ]。我正在尝试删除非字母数字条目,例如'名称','日期',' '' - '并保留MO.A2.v05.005'部分。我为此写了下面的代码:

for i in range(0,len(tmp)):
...     ch=tmp[i].translate(None,'.')
...     if ~ch.isalnum():
...             tmp.remove(tmp[i])

我收到错误

File "<stdin>", line 2, in <module>
IndexError: list index out of range
然而,我确实通过以下方式完成了工作:

for i in tmp:
...     ch=i.translate(None,'')
...     if ~ch.isalnum():
...             tmp.remove(i)
... 

任何人都知道为什么第一个代码不起作用

1 个答案:

答案 0 :(得分:3)

为什么它没有工作?

简短版:因为len(temp)正在减少,而range()并不知道。

长版 range(0,len(tmp))仅在for循环开始时执行一次。这将从[0....len(temp)]返回列表。这是for循环开始之前的当前长度。

现在for循环将继续迭代此列表,而不知道列表是否会减少到[0....len(temp) - n ]是for循环的后续迭代

即如果初始长度为5,我们从列表中删除了2个元素,那么temp[3]temp[4]都将导致IndexErrors,因为新列表没有它们

解决方案

您可以使用list comprehensions代替

[ x for x in tmp if "." in x ]

<强>测试

>>> tmp=['Name','Date','   ','-','MO.A2.v05.005']
>>> [ x for x in tmp if "." in x ]
['MO.A2.v05.005']