Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 索引应在范围内…但不是';T_Python_List_Indexing_Range_Grammar - Fatal编程技术网

Python 索引应在范围内…但不是';T

Python 索引应在范围内…但不是';T,python,list,indexing,range,grammar,Python,List,Indexing,Range,Grammar,我正在尝试编写代码来检查是否有人在同一个句子中切换了时态。它从文本框中获取数据,将其拆分成句子,将这些句子拆分成单词,并对照不同时态的动词列表检查单词。如果句子前后不一致,则突出显示。我已经成功地做到了这一点,但我也希望在返回文本框时保持文本的格式不变。程序也会这样做,但是如果一段的第一句不一致,它会突出显示第一段和句子之间的所有空格。我试着运行一个if语句来查找扩展的空格,并将其与句子分开,这样高亮笔就不会将其作为句子的一部分。但是,我一直遇到此错误:索引器错误:列表索引超出范围 任何帮助都将

我正在尝试编写代码来检查是否有人在同一个句子中切换了时态。它从文本框中获取数据,将其拆分成句子,将这些句子拆分成单词,并对照不同时态的动词列表检查单词。如果句子前后不一致,则突出显示。我已经成功地做到了这一点,但我也希望在返回文本框时保持文本的格式不变。程序也会这样做,但是如果一段的第一句不一致,它会突出显示第一段和句子之间的所有空格。我试着运行一个
if
语句来查找扩展的空格,并将其与句子分开,这样高亮笔就不会将其作为句子的一部分。但是,我一直遇到此错误:
索引器错误:列表索引超出范围

任何帮助都将不胜感激

以下是相关代码:

def verbTense(self):#Checks sentences for inconsistent tenses
    text=self.input.get(1.0,'end')
    self.input.delete(1.0,'end')
    text=sentenceSplit(text)
    self.input.tag_config('verb',background='yellow')
    for i in text:
        if inconsistentTense(i)==True:
            self.input.insert('end',i,'verb')
        else:
            self.input.insert('end',i)

def sentenceSplit(x):#Splits a string into sentences.
    fullText=[]
    tempSentence=[]
    x=formatSplit(x)
    index=0
    for i in x:
        if i==" " and x[index+1]==" ":
            fullText.append(i)
        else:
            if ".)" in i or "!" in i or "?" in i or "." in i or "!)" in i or "?)" in i or ")" in i or "]" in i or "}" in i:
                tempSentence.append(i)
                sentence=listIntoWord(tempSentence)
                fullText.append(sentence)
                tempSentence=[]
            else:
                tempSentence.append(i)
        index+=1
    return fullText

def listIntoWord(x):#Combines list of strings into one single string.
    text=""
    for i in x:
        text+=str(i)
    return text

def formatSplit(x):#Splits a string into different words while keeping the spaces. 
    wordString=[]
    totalString=[]
    for i in x:
        if i==" ":
            wordString=listIntoWord(wordString)
            totalString.append(wordString)
            wordString=[]
            totalString.append(i)
        else:
            wordString.append(i) 
    return totalString

在循环结束时,
索引将指向字符串中的最后一个字符,访问
x[index+1]
将引发索引器。

您的问题在于
语句拆分()中的这些代码行。

这个循环的主体将执行
len(x)
次,在最后一次迭代中
index
将是
len(x)-1
,因此
x[index+1]
将等同于
x[len(x)]
。这将导致索引器出错,因为序列
x
中的最后一项位于索引
len(x)-1
,因此
len(x)
超过了序列的末尾

要解决此问题,您可以执行以下两项操作之一:

  • 只循环到倒数第二个项目,因此当您在每次迭代中向前看时,您永远不会通过序列的结尾:

    for index, i in enumerate(x[:-1]):
        if i == " " and x[index+1] == " ":
            ...
    
  • 不要在最后一次迭代中执行下一项的检查:

    for index, i in enumerate(x):
        if i == " " and (index == len(x)-1 or x[index+1] == " "):
            ...
    
您可以选择更适合您的代码


请注意,我还修改了代码,使其使用
enumerate()
,这是在项目和索引上循环的首选方式。

文本墙。。。太长,读不下去了您的索引超出范围。。。。请发布一个小的自包含示例,演示您的问题…完整堆栈跟踪,请问哪一行有错误?如果i==“”和x[index+1]==“”:我也这么认为,只是我在末尾添加了临时句点,它仍然突出显示了中间的空格。等等,它仍然会测试它,那么我是否需要添加一个if语句来确保我不在迭代的末尾?
for index, i in enumerate(x[:-1]):
    if i == " " and x[index+1] == " ":
        ...
for index, i in enumerate(x):
    if i == " " and (index == len(x)-1 or x[index+1] == " "):
        ...