【问题标题】:IndexError: list index out of range in python for stringsIndexError:在python中为字符串列出超出范围的索引
【发布时间】:2016-06-01 17:42:24
【问题描述】:

我想从这个数组中删除单词“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(tokens)); n=(len(stop)); for i in range(m): print (i) for j in range(n): print(j) if(tokens[i] == stop[j]): del(token[i]) m=m-1 " 但是将它添加到新列表有帮助.谢谢

标签: python list indexoutofboundsexception


【解决方案1】:

您收到此错误的原因有两个:

  • 您在 Python 中使用 range(len(sequence)) 的反模式。你应该使用for index, value in enumerate(sequence)
  • 您在遍历序列时正在对其进行变异。

range(len(...)) 的调用只计算一次。因此,当您加注星标时,它的计算结果为 5。删除停用词后,列表不再有 5 个元素,因此 token[4] 会导致 IndexError

【讨论】:

    【解决方案2】:

    你得到一个索引越界异常,因为你正在从一个正在迭代的数组中删除一个项目。

    删除该项目后,len(token) 为 4,但您的 for 循环迭代 5 次(从初始 len(token) 返回 5)。

    有两种方法可以解决这个问题。更好的方法是简单地调用

    token.remove(stop)
    

    这种方式不需要遍历列表,并且会自动删除数组中值为stop的第一项。

    来自documentation

    list.remove(x):从列表中删除值为 x 的第一项。如果没有这样的项目是错误的。

    鉴于此信息,您可能需要先检查列表是否包含目标元素以避免抛出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
    

    【讨论】:

      【解决方案3】:

      不建议在迭代此列表时删除列表元素。我不确定您的意图,但您可以创建一个没有 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 不会。

      【讨论】:

        【解决方案4】:

        删除一个项目后,列表中的项目将不再像原来那样多,因此i 会变得太大。此外,如果您删除索引i 处的项目,那么以前位于i+1 的元素现在将位于索引i,但您的代码不会检查它,因为它会继续并递增@987654325 @。

        【讨论】:

          【解决方案5】:

          删除后使用 break 语句,因为您正在修改您正在迭代的同一个列表。

          for i in range(len(token)):
            if(token[i]==stop):
              del(token[i])
              break 
          

          【讨论】:

            【解决方案6】:

            我不同意任何其他答案,但最 Pythonic 的解决方案是完全摆脱循环并用一行替换它:

            token.remove(stop)
            

            这将从列表中删除第一次出现的 'hello'。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-01-30
              • 1970-01-01
              • 1970-01-01
              • 2017-03-26
              • 2012-02-01
              • 1970-01-01
              • 2021-07-23
              相关资源
              最近更新 更多