str.replace给出s [i-1]超出范围错误

时间:2017-10-26 17:18:56

标签: python python-3.x

import sys

def super_reduced_string(s):   
    i=len(s)-1  
    while(i>0):  
        if(s[i]==s[i-1]):
            s=s.replace(s[i],'')
            s=s.replace(s[i-1],'')
            i=len(s)-1
        else:
            i-=1
    return (s)

例如,如果我取一个字符串"aaabccddd",那么i的值在开始时为8。我的if语句为真,因此字符串变为'aaabccdd'

之后我想删除s[i-1]s[7]),然后您的字符串应该变为"aaabccd"

为什么会引发IndexError例外,说s[i-1]超出范围?

1 个答案:

答案 0 :(得分:2)

您要删除多个字符str.replace()找到给定字符串的所有次出现并替换它们。 s[8]'d',因此您从字符串中删除了所有 'd'字符:

>>> s = 'aaabccddd'
>>> i = len(s) - 1
>>> i
8
>>> s.replace(s[i], '')
'aaabcc'

现在s只有6个字符,因此s[i-1] s[7]超出了范围。

如果您想从字符串中删除一个字符,请不要使用str.replace();你必须使用切片:

s = s[:i - 1] + s[i + 1:]  # remove the doubled character found

切片总是成功,它永远不会抛出IndexError,但会导致空字符串。

工作代码(抛出一些PEP-8空格):

def super_reduced_string(s):   
    i = len(s) - 1 
    while i:  
        if s[i] == s[i-1]:
            s = s[:i - 1] + s[i + 1:]
            i = len(s) - 1
        else:
            i -= 1
    return s

这会产生:

>>> super_reduced_string('aaabccddd')
'abd'