Python 3中“字符串索引超出范围”的怪异解决方案-无法找出原因?

时间:2018-08-22 11:03:20

标签: python for-loop range indexoutofrangeexception

所以我正在做MIT 6.00.1类,遇到一个问题集,在这里我必须确定随机生成的字符串中最长的字母子字符串(例如,“ abcdtttyyttt”,最长的字母子字符串将是“ abcdt”)。

我解决问题的代码如下:

s = "abzabc"

longestWord = []
subStr = []

for i in range(len(s)):

    if s[i] >= s[i-1]:           
        subStr += s[i]     

    else:
        subStr = s[i]

    if len(subStr) > len(longestWord):
        longestWord = subStr

print("Longest substring in alphabetical order is: ", "".join(longestWord))

!!!但这是我不理解的!!!

在弄清楚这一点之前,我花了几个小时在一个解决方案上,将“ s”字符串中的当前字符(我必须检查的随机生成的字符串)与下一个字符进行比较,如下所示:

if s[i] < s[i+1]

使用此解决方案,我总是最终得到“字符串索引超出范围”,因为我正在查看的字符串中字母之间的最后一个比较超出了范围,因为没有要检查的字母反对(s [i] +1部分)。

当我将s [i]与s [i] -1比较时,如何不出现“字符串索引超出范围”错误?当然,第一个字母前面没有字母,这意味着我有点“超出范围”了吗?

希望有人可以向我解释!我在其他任何地方都找不到答案。

2 个答案:

答案 0 :(得分:1)

问题是s[i-1]为零时is[-1]。这不会返回字符串开头之前的字符,而是返回字符串的 last 字符。这可能不是您想要的!

解决方法可能是回到使用s [i + 1],但要使用:

for i in range(len(str)-1):

它将在字符串的最后一个字符之前停止。

或者,您可以使用:

 for i in range(2, len(str)):

i将从1开始(假设至少有两个字符-您可能需要特殊情况下一个字符串)。

答案 1 :(得分:1)

您的代码可以使用,但是首先您需要分配subStr的s [0]值。

s = "abzabd"

longestWord = ''
subStr = s[0]

for i in range(1, len(s)):

    if s[i] >= s[i-1]:
        subStr += s[i]     

    else:
        subStr = s[i]

    if len(subStr) > len(longestWord):
        longestWord = subStr

print(longestWord)

您可以将key kwarg设置为max()函数和生成器函数来使用len函数:

def get_ascending_words(s):
    if not s:
        return
    if len(s) == 1:
        yield s
        return
    ws, i = 0, 1
    while True:
        if ws >= len(s):
            break
        while i < len(s) and s[i] > s[i-1]:
            i += 1
        yield s[ws:i]
        ws = i
        i += 1

s = "abzabcd"

print(list(get_ascending_words(s)))
print(max(*get_ascending_words(s), key=len))