Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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 始终存在此错误';索引器:字符串索引超出范围';,当我考虑到指数范围时_Python - Fatal编程技术网

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)