我有一个列表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)
...
任何人都知道为什么第一个代码不起作用
答案 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']