Python 3字符串相邻重复字符删除问题及代码故障排查
解决Python中删除字符串相邻重复字符的问题
我来帮你搞定这个需求,先拆解下你两次尝试里的问题,再给你几个实用的解决方案~
先看看你两次尝试的问题
尝试1的问题
你这段代码里有两个关键问题:
- Python的字符串是不可变类型,
string.replace(string[i],"")会返回一个新的字符串,但你没有把这个新字符串赋值回原变量,所以原string根本没变化。 - 退一步说,就算你赋值了,
replace会把字符串中所有匹配的字符都删掉,比如输入AABBC会直接变成BC,这和你要保留单个不重复相邻字符的需求不符。
尝试2的问题
用列表处理的思路是对的,但你在遍历列表的同时pop元素,会导致索引混乱:
- 当你删掉一个元素后,列表后面的元素会往前移动,但循环的索引还是按原来的列表长度走,这就会跳过一些需要检查的字符,所以处理不了3个及以上的重复(比如
AAABB里的第二个A就会被漏掉)。 - 你提到的索引越界问题,也是因为循环范围是固定的,而列表长度在
pop后会动态变短,导致后续的索引超出了新列表的范围。
正确的实现方法
这里给你两种靠谱的写法,都能完美处理任意长度的相邻重复:
方法1:手动遍历构建结果
这种写法逻辑清晰,容易理解,适合新手:
s = input().strip() # 处理空输入的情况 if not s: print("") exit() # 初始化结果列表,先加入第一个字符 result = [s[0]] # 从第二个字符开始遍历 for char in s[1:]: # 如果当前字符和结果最后一个字符不同,就加入 if char != result[-1]: result.append(char) # 把列表转成字符串输出 print(''.join(result))
比如输入AAABBBCC,遍历的时候会跳过所有和结果最后一个字符相同的重复项,最终得到ABC。
方法2:用itertools.groupby简化代码
如果想写得更简洁,可以用Python标准库的groupby,它专门用来处理相邻重复的分组:
from itertools import groupby s = input().strip() # groupby会把相邻相同的字符分成一组,我们只取每组的key(也就是重复的那个字符) result = ''.join(key for key, group in groupby(s)) print(result)
这个写法非常简洁,groupby帮你完成了所有相邻重复的判断,直接拼接每个分组的key就能得到结果。
内容的提问来源于stack exchange,提问作者Riptide
相关产品推荐
相关产品推荐

