我想从这个数组中删除"hello"这个词,但是我得到了"index out of bounds"错误。 我检查了len(token)的范围; 它是(0,5)。
这是代码:
token=['hi','hello','how','are','you']
stop='hello'
for i in range(len(token)):
if(token[i]==stop):
del(token[i])
我尝试使用它作为修复方法,但得到相同的错误代码"m =(len(令牌)); n =(len(停止));对于范围(m)中的i:打印(i)范围内的j( n):print(j)if(tokens [i] == stop [j]):del(token [i])m = m-1"但是将它添加到新列表中有帮助。 谢谢
您正在获取索引超出范围的异常,因为您正在从正在迭代的数组中删除项目。
删除该项后,len(token)为4,但for循环重复5次(从初始len(token)返回5)。
有两种方法可以解决这个问题。更好的方法是简单地打电话
token.remove(stop)
这种方式不需要迭代列表,并将自动删除值为stop的数组中的第一项。
从文档:
list.remove(x): Remove the first item from the list whose value is x. It is an error if there is no such item.
鉴于此信息,您可能需要先检查列表是否包含目标元素,以避免抛出ValueError:
if stop in token:
token.remove(stop)
如果元素可以在列表中多次存在,则使用while循环将删除它的所有实例:
while stop in token:
token.remove(stop)
如果由于某种原因需要迭代数组,另一种方法是在del(token[i])之后添加break,如下所示:
for i in range(len(token)):
if(token[i]==stop):
del(token[i])
break
迭代此列表时,不建议删除列表元素。我不确定你的意图,但你可以创建一个没有stop的新列表
token=['hi','hello','how','are','you']
stop='hello'
new_tokens = []
for i in range(len(token)):
if(token[i]!=stop):
new_tokens.append(token[i])
或创建包含所有内容的列表,直到达到停止:
token=['hi','hello','how','are','you']
stop='hello'
new_tokens = []
for i in range(len(token)):
if(token[i]!=stop):
new_tokens.append(token[i])
else:
break
但是永远不要从正在迭代的列表中删除元素,因为这样会修改列表的长度,但range不会。
我不同意任何其他答案,但最Pythonic解决方案是完全摆脱循环并用一行替换它:
token.remove(stop)
这将从列表中删除第一次出现的'hello'。
删除后使用break语句,因为您正在修改要迭代的相同列表。
for i in range(len(token)):
if(token[i]==stop):
del(token[i])
break
删除项目后,列表中的项目不再像原来那样多,因此i会变得太大。此外,如果删除索引i的项目,那么以前位于i+1的元素现在将位于索引i,但您的代码将不会检查它,因为它继续并递增。
您收到此错误的原因有两个:
你在range(len(sequence))的Python中使用反模式。你应该使用for index, value in enumerate(sequence)
当您迭代它时,您正在改变序列。
对range(len(...))的调用仅评估一次。所以当你加星星时它的计算结果为5.一旦你删除了停用词,列表就不再有5个元素,所以token[4]会产生IndexError