假设我有一个按字母顺序排列的字符串,基于字母重复的次数。
- 示例:“BBBAADDC”。
有 3 个 B,因此它们位于开头,2 个 A 和 2 个 D,因此 A 位于 D 之前,因为它们按字母顺序排列,还有 1 个 C。另一个例子是 CCCCAAABBDDAB。
请注意,中间某处可以有 4 个字母(即 CCCC),因为可能有 2 对 2 个字母。
但是,假设我只能连续有 n 个字母。例如,如果第二个示例中的 n = 3,那么我必须从 4 个 C 的第一个子字符串中省略一个“C”,因为一行中最多只能有 3 个相同的字母。
另一个例子是字符串“CCDDDDAABC”;如果n = 2,我必须删除一个C和一个D才能得到字符串CCDDAABC
输入/输出示例:
- n=2:输入:AABBCCCCDE,输出:AABBCCDE
- n=4:输入:EEEEFFFFGGG,输出:EEEEFFFFGGG
- n=1:输入:XXYYZZ,输出:XYZ
我怎样才能用Python做到这一点?提前致谢!
这就是我现在所拥有的,尽管我不确定它是否在正确的轨道上。这里,z是字符串的长度。
for k in range(z+1):
if final_string[k] == final_string[k+1] == final_string[k+2] == final_string[k+3]:
final_string = final_string.translate({ord(final_string[k]): None})
return final_string
最佳答案
好的,基于on your comment ,您要么对字符串进行预排序,要么不需要按您尝试创建的函数进行排序。您可以使用itertools.groupby()
更轻松地做到这一点:
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'
在每个组 g
中,它会被展开,然后切片直到 n
个元素([:n]
部分),这样您就可以获得每个字母最多连续n
次。如果相同的字母出现在其他地方,则在连续计算 n
时将其视为独立序列。
编辑:这是一个较短的版本,对于很长的字符串也可能表现更好。当我们使用 itertools
时,这个工具还使用 itertools.chain.from_iterable()
创建扁平的字母列表。由于每个都是生成器,因此仅在最后一行评估/扩展:
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)
关于Python-删除字符串中的重复字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66510486/