Python 始终存在此错误';索引器:字符串索引超出范围';,当我考虑到指数范围时
需要编写一个程序,打印变量的最长子字符串,其中字母按字母顺序出现 例如,Python 始终存在此错误';索引器:字符串索引超出范围';,当我考虑到指数范围时,python,Python,需要编写一个程序,打印变量的最长子字符串,其中字母按字母顺序出现 例如,s='onsjdfjqiwkvftwfbx',它应该返回'dfjq' 作为初学者,代码编写如下: y=() z=() for i in range(len(s)-1): letter=s[i] while s[i]<=s[i+1]: letter+=s[i+1] i+=1 y=y+(letter,) z=z+(len(letter),) print(y[z
s='onsjdfjqiwkvftwfbx'
,它应该返回'dfjq'
作为初学者,代码编写如下:
y=()
z=()
for i in range(len(s)-1):
letter=s[i]
while s[i]<=s[i+1]:
letter+=s[i+1]
i+=1
y=y+(letter,)
z=z+(len(letter),)
print(y[z.index(max(z))])
它将产生所需的结果,直到我将其更改为范围(len(s)-3)
希望就以下事项寻求意见:
范围(len(s)-1)
会导致此类错误消息?为了处理高达i+1的索引,我已经将范围值减少了1。
我的基本原理是,如果变量s的长度是14,它的索引从0-13,范围(14)产生值0-13。然而,由于我的代码涉及i+1索引,所以为了处理这一部分,范围减少了1
s='abcdefghijklmnopqrstuvwxyz'
,则上述代码的范围(len(s)-3)再次返回索引器:字符串索引超出范围。为什么?这个代码怎么了
感谢您的帮助~超出范围索引的原因是,在内部
循环中,您在推进i
时没有检查其范围。您的代码也非常低效,因为您有嵌套的循环,并且您正在进行大量相对昂贵的字符串连接。没有连接的线性时间算法如下所示:
s = 'onsjdfjqiwkvftwfbcdefgxa'
# Start by assuming the longest substring is the first letter
longest_end = 0
longest_length = 1
length = 1
for i in range(1, len(s)):
if s[i] > s[i - 1]:
# If current character higher in order than previous increment current length
length += 1
if length > longest_length:
# If current length, longer than previous maximum, remember position
longest_end = i + 1
longest_length = length
else:
# If not increasing order, reset current length
length = 1
print(s[longest_end - longest_length:longest_end])
关于“1”:
实际上,使用range(len(s)-2)
也应该有效
原因范围(len(s)-1)
中断:
对于“onsjdfjqiwkvftwfbx”,len()
将等于18。不过,您可以引用的最大索引是17(因为索引从0开始)。
因此,当您循环通过“i”时,在某个点上,i将增加到17(对应于len(s)-1
),然后在中尝试访问s[i+1]
,同时进行比较(这是不可能的)
关于“2”:
以下方面应起作用:
current_output = ''
biggest_output = ''
for letter in s:
if current_output == '':
current_output += letter
else:
if current_output[-1]<=letter:
current_output += letter
else:
if len(current_output) > len(biggest_output):
biggest_output = current_output
current_output = letter
if len(current_output) > len(biggest_output):
biggest_output = current_output
print(biggest_output)
当前_输出=“”
最大输出=“”
对于字母s:
如果当前_输出=“”:
当前输出+=字母
其他:
如果当前_输出[-1]len(最大_输出):
最大输出=当前输出
当前输出=字母
如果len(当前输出)>len(最大输出):
最大输出=当前输出
打印(最大输出)
请不要将代码添加为图像,这会使其难以阅读、难以搜索,并且对于视力低下等易访问性问题的人来说几乎不可能阅读。在循环中使用i
,并在那里递增,比较数组的值以决定何时停止。由于外部范围的原因,这不会自动结束,因此内部的i+=1
会导致索引i
的增量超过字符串的长度@MatsLindh,请你详细说明一下好吗?我不太明白我应该如何修改代码。谢谢你提供这个替代方案。但是,请注意,如果s='hdppsbsmxmfgynz',上述代码显然无法提供'dpps'的正确答案。您好~感谢您在本例中指出while循环的问题。尝试了上面的代码s='hdppsbmxmfgynz',但也无法生成正确的'dpps'字符串。@hanami你说得对-我做了。打字错误。请检查编辑后的版本。@hanami如果我修改后的答案解决了您的问题,请您发表意见好吗?
current_output = ''
biggest_output = ''
for letter in s:
if current_output == '':
current_output += letter
else:
if current_output[-1]<=letter:
current_output += letter
else:
if len(current_output) > len(biggest_output):
biggest_output = current_output
current_output = letter
if len(current_output) > len(biggest_output):
biggest_output = current_output
print(biggest_output)