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]
超出范围?
答案 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'