You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3字符串相邻重复字符删除问题及代码故障排查

解决Python中删除字符串相邻重复字符的问题

我来帮你搞定这个需求,先拆解下你两次尝试里的问题,再给你几个实用的解决方案~

先看看你两次尝试的问题

尝试1的问题

你这段代码里有两个关键问题:

  1. Python的字符串是不可变类型,string.replace(string[i],"")会返回一个新的字符串,但你没有把这个新字符串赋值回原变量,所以原string根本没变化。
  2. 退一步说,就算你赋值了,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:34:01