<p>好的,基于<a href="https://stackoverflow.com/questions/66510486/python-removing-repeated-letters-in-a-string#comment117578808_66510486">on your comment</a>,您可以对字符串进行预排序,也可以不按您试图创建的函数对其进行排序。使用<a href="https://docs.python.org/3/library/itertools.html#itertools.groupby" rel="nofollow noreferrer">^{<cd1>}</a>可以更轻松地执行此操作:</p>
<pre class="lang-py prettyprint-override"><code>import itertools
def max_seq(text, n=1):
result = []
for k, g in itertools.groupby(text):
result.extend(list(g)[:n])
return ''.join(result)
max_seq('AAABBCCCCDE', 2)
# 'AABBCCDE'
max_seq('EEEEEFFFFGGG', 4)
# 'EEEEFFFFGGG'
max_seq('XXYYZZ')
# 'XYZ'
max_seq('CCCDDDAABC', 2)
# 'CCDDAABC'
</code></pre>
<p>在每个组<code>g</code>中,它被展开,然后被切片到<code>n</code>元素(即<code>[:n]</code>部分),因此一行中每个字母最多<code>n</code>次。如果同一个字母出现在其他地方,则在对一行中的<code>n</code>进行计数时,它被视为一个独立的序列</p>
<hr/>
<p>编辑:这里有一个较短的版本,对于很长的字符串,它的性能可能会更好。当我们使用<code>itertools</code>时,这个函数还使用<a href="https://docs.python.org/3/library/itertools.html#itertools.chain.from_iterable" rel="nofollow noreferrer">^{<cd8>}</a>来创建扁平的字母列表。由于它们都是一个生成器,因此仅在最后一行对其进行求值/展开:</p>
<pre class="lang-py prettyprint-override"><code>import itertools
def max_seq(text, n=1):
sequences = (list(g)[:n] for _, g in itertools.groupby(text))
letters = itertools.chain.from_iterable(sequences)
return ''.join(letters)
</code></pre>