IndexError,即使索引变量应在

时间:2017-11-20 01:56:41

标签: python variables index-error

编辑:将'hi'更新为'list'

我是一名初学者,我一直在研究将英语句子翻译成猪拉丁语的项目,但是在尝试删除句子中标点符号之前的空格时遇到了一个问题。这是我遇到麻烦的脚本。

import string

list = ['H', 'i', 's', 't', 'a', 'y', ' ', 's', 'i', 'a', 'y', ' ', 'a', 'a', 'y', ' ', 'e', 's', 't', 't', 'a', 'y', ' ', '.', ' ', 'H', 'i', 's', 't', 'a', 'y', ' ', 's', 'i', 'a', 'y', ' ', 'a', 'a', 'y', ' ', 'e', 's', 't', 't', 'a', 'y']

h = 0

for h in range(len(list)):
    if list[h] in string.whitespace:
        if list[h + 1] in string.punctuation:
            list.pop(h)
            h = h + 1
        else:
            h = h + 1
    else:
        h = h + 1

print(list)

当我运行它时,我收到错误:

  File " ... ", line 110, in <module>
    if list[h] in string.whitespace:
IndexError: list index out of range

当我在循环外打印Hi [h]时,索引“ h ”没有问题

关于我犯错的地方或我可以改变的地方的任何想法?

如果最好看到完整档案,请告诉我。

1 个答案:

答案 0 :(得分:1)

您在此处有两个列表:hilist,其中hi可能是您尝试转换为Pig Latin的字符串。

请注意,您的循环索引的长度为hifor h in range(len(hi)),但在您的代码中,您使用h来索引list,例如: if list[h] in string.whitespace。从错误中看,您的输入字符串hi似乎比list长,因此当遇到h的值大于list的长度时,它抛出了这个错误。

我认为您打算在整个代码中引用hi(但我可能错了,您的问题并不清楚),所以只需将list的所有实例替换为{{1} }}

已更新,以反映更新后的问题:

在您的代码hi中删除列表中的元素,这会减少列表的大小。因此,如果最初在list.pop(h)时长度为20个元素,则循环仍会运行直到index = 19,但是list会越来越短,所以在某些时候,不再有20个元素。

这些情况下的常见策略是向后遍历列表。看一下答案here