Python索引器错误:子字符串程序中的字符串索引超出范围
我正在为一个类编写代码,该类希望我编写一个代码,使用嵌套循环检查字符串中的子字符串 基本上,我的老师想证明函数“in”是如何实现的,如: 香蕉中的安娜将返回真值 该程序的目标是生成两个参数的函数Python索引器错误:子字符串程序中的字符串索引超出范围,python,regex,string,substring,Python,Regex,String,Substring,我正在为一个类编写代码,该类希望我编写一个代码,使用嵌套循环检查字符串中的子字符串 基本上,我的老师想证明函数“in”是如何实现的,如: 香蕉中的安娜将返回真值 该程序的目标是生成两个参数的函数 substring(subStr,fullStr) 这将打印出一句话,如果subStr是fullStr的子字符串,我的程序如下: def substring(subStr,fullStr): tracker="" for i in (0,(len(fullStr)-1)):
substring(subStr,fullStr)
这将打印出一句话,如果subStr是fullStr的子字符串,我的程序如下:
def substring(subStr,fullStr):
tracker=""
for i in (0,(len(fullStr)-1)):
for j in (0,(len(subStr)-1)):
if fullStr[i]==subStr[j]:
tracker=tracker+subStr[j]
i+=1
if i==(len(fullStr)-1):
break
if tracker==subStr:
print "Yes",subStr,"is a substring of",fullStr
当我调用解释器“substringana,banana”中的函数时,它在第5行打印出一个回溯错误,表示字符串索引超出范围:
if fullStr[i]==subStr[j]:
我拼命想找出错误。任何帮助都将不胜感激这里有几个单独的问题 在外循环的每次迭代中,都不会重置跟踪器。这意味着以前迭代的剩余部分会污染以后的迭代。 您没有使用range,而是在仅包含0和每个字符串长度的元组上循环。 您正在尝试递增外部计数器并跳过外部循环迭代的检查。 在尝试索引到外部字符串之前,没有正确执行边界检查。 这是一个正确的版本
def substring(subStr,fullStr):
for i in range(0,(len(fullStr))):
tracker=""
for j in range(0,(len(subStr))):
if i + j >= len(fullStr):
break
if fullStr[i+j]==subStr[j]:
tracker=tracker+subStr[j]
if tracker==subStr:
print "Yes",subStr,"is a substring of",fullStr
return
substring("ana", "banana")
首先,您的循环应该是
for i in xrange(0,(len(fullStr))):
比如说。i在0中,lenfullStr-1将让我第一次接受0的值,然后第二次接受lenfullStr-1。我假设通过你的算法,你希望它也具有中间值
现在,关于错误,请考虑我在for循环的最后一次传递。我将等于lenfullStr-1。现在当我们执行i+=1时,i等于lenfullStr。这并没有满足i==lenfullStr-1的条件,所以我们不会中断、循环和崩溃。如果您在if-fullStr[i]==subStr[j]:语句之前选择了if>=lenfullStr-1或检查了i==lenfullStr-1,则会更好
最后,虽然与问题无关,但您不会在每次停止检查某个匹配项时重置跟踪程序。您应该将tracker=放在xrange0中的for i后面,lenfullStr:line。在从i开始循环遍历列表后,您也不会检查tracker是否正确,当您得到一个不匹配的字符时,也不会中断循环,而是继续并可能拾取更多匹配的字母,但不是连续的 以下是一个完全更正的版本:def substring(subStr,fullStr):
for i in xrange(0,(len(fullStr))):
tracker="" #this is going to contain the consecutive matches we find
for j in xrange(0,(len(subStr))):
if i==(len(fullStr)): #end of i; no match.
break
if fullStr[i]==subStr[j]: #okay, looks promising, check the next letter to see if it is a match,
tracker=tracker+subStr[j]
i+=1
else: #found a mismatch, leave inner loop and check what we have so far.
break
if tracker==subStr:
print "Yes",subStr,"is a substring of",fullStr
return #we already know it is a substring, so we don't need to check the rest
在第5行之前放上打印i,j,然后查看结果。不要增加i-for循环正在增加i,为您添加一些打印,以显示您的程序在循环中做了什么,您可能会更好地了解发生了什么以及哪里出错。正如furas所说,我将打印i,j放在第5行之前,然后,我也像karthikr说的那样,为我保留了增量。程序运行了,我不知道为什么程序跳过了j的元素1,在检查了0之后直接转到了2。谢谢你的回答。谢谢,你的回答真的很有帮助。我是一名初级程序员,大学第一学期。对不起,如果我犯了愚蠢的错误,这也是我第一次使用stackoverflow帐户。在这里学到了很多。@user3786963,这不是问题。您在描述问题和向我们展示您的尝试方面做得相当好。