关于python:str.replace给出了s [i-1]超出范围的错误

str.replace gives s[i-1] out of range error

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
12
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]超出范围?


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

1
2
3
4
5
6
>>> s = 'aaabccddd'
>>> i = len(s) - 1
>>> i
8
>>> s.replace(s[i], '')
'aaabcc'

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

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

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

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

工作代码(插入了一些PEP-8空白):

1
2
3
4
5
6
7
8
9
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

这产生:

1
2
>>> super_reduced_string('aaabccddd')
'abd'