函数删除超过 2 个连续重复的字符串不起作用

Function to remove more than 2 consecutive repetitions of a string not working

这是我的函数:

def remove_more_than_two_reps(text):
    result = list(text)
    for idx,char in enumerate(text):       
        if(result[:idx].count(char) > 2):
            result.remove(char) 
    return ''.join(result) 

预期结果:

text = 'teeeexxxxt'
result = remove_more_than_two_reps(text)
>'teexxt'

我的函数只是returns原来的字符串,有什么问题吗?

尝试使用 appendO(1) 而不是 removeO(n):

def remove_more_than_two_reps(text: str) -> str:
    result = []
    for ch in text:
        if len(result) < 2 or result[-1] != ch or result[-2] != ch:
            result.append(ch)
    return ''.join(result)

text = 'teeeexxxxt'
result = remove_more_than_two_reps(text)
print(result)

输出:

teexxt

想分享一个 itertools 解决方案,当你有特别大的字符串时很有用(因为它避免分配一个巨大的列表):

import itertools as it

def remove_more_than_two_reps(text: str) -> str:
    reps_of_at_most_two = (it.islice(reps, 2) for _, reps in it.groupby(text))
    return ''.join(it.chain.from_iterable(reps_of_at_most_two))

请注意,此解决方案只遍历字符串中的每个字符,因此它也具有最佳复杂度!


另一个选项可能是使用模式,匹配相同字符 3 次或更多次 (.){2,} 并在替换中使用捕获组值的 2 倍:

import re

def remove_more_than_two_reps(text):
    return re.sub(r'(.){2,}', r'', text)

text = 'teeeexxxxt'

print(remove_more_than_two_reps(text))

输出

teexxt

看到一个regex demo and a Python demo