python - 当我考虑到索引范围时,总是有这个错误 'IndexError: string index out of range'

标签 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.index(max(z))])

但是,上面的代码总是会返回

IndexError: string index out of range.

它将产生所需的结果,直到我将其更改为 range(len(s)-3)

想寻求建议:

  1. 为什么range(len(s)-1)会出现这样的错误信息?为了处理直到 i+1 的索引,我已经将范围值减 1。 我的理由是,如果变量 s 的长度是 14,它的索引是 0-13,range(14) 产生值 0-13。然而,由于我的代码涉及 i+1 索引,范围减少 1 以处理这部分。

  2. 如何修改以上代码以产生正确的结果。 如果 s = 'abcdefghijklmnopqrstuvwxyz',上面带有 range(len(s)-3) 的代码再次返回 IndexError: string index out of range。为什么?这段代码有什么问题?

感谢任何帮助~

最佳答案

索引超出范围的原因是,在您的内部 while 循环中,您正在推进 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])

关于python - 当我考虑到索引范围时,总是有这个错误 'IndexError: string index out of range',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62487046/

相关文章:

python - 从行中删除任何 0 值,按行降序排列值,对于行中的每个非 0 值,将索引、列名和分数返回到新的 df

python - 如何将矩形拟合到 python 中的图像并获取它们的坐标

python - 如何用空格分隔符分割字符串列表?

python - MongoDB - 不存在字段的错误处理

python - 使用函数变量进行 Pandas groupby

python - 为 Python 2.6 安装 Dropbox API 时遇到问题

python - Django 模型,方法的@property 装饰器

python - Python 3.4 中的包装函数缺少必需的位置参数

javascript - JavaScript 中 Var 的 bool 值

python - 在 Python 中生成随机向量