Python删除字符串中的重复字母

2024-09-30 22:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个按字母顺序排列的字符串,基于字母重复的次数

  • 例如:“BBBAADDC”

有3个B,所以它们在开头,2个A和2个D,所以A在D之前,因为它们是按字母顺序排列的,1个C。另一个例子是CCCCAABBDDAB

注意,在中间某个地方有4个字母(即ccCC),因为可能有2对2个字母。

但是,假设我一行只能有n个字母。例如,如果在第二个示例中n=3,那么我必须从4个C的第一个子串中省略一个“C”,因为一行中最多只能有3个相同的字母

另一个例子是字符串“CCCDDDAABC”;如果n=2,我必须删除一个C和一个D才能得到字符串CCDDAABC

输入/输出示例:

  1. n=2:输入:AABBCCDE,输出:AABBCCDE
  2. n=4:输入:EEEEFFFFGGG,输出:EEEEFFGGG
  3. n=1:输入:xxyyz,输出: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

Tags: 字符串示例string地方字母次数例子省略
3条回答
hello = "hello frrriend"


def replacing() -> str:
    global hello
    j = 0
    for i in hello:
        if j == 0:
            pass
        else:
            if i == prev:
                hello = hello.replace(i, "")
                prev = i
        prev = i
        j += 1
    return hello

replacing()

看起来有点原始,但我认为它是有效的,这就是我在旅途中想到的,希望它能有所帮助:D

以下是我的解决方案:

def snip_string(string, n):
    list_string = list(string)
    list_string.sort()
    chars = set(string)
    for char in chars:
        while list_string.count(char) > n:
            list_string.remove(char)
    return ''.join(list_string)

使用n的各种值调用函数会得到以下输出:

>>> string = "AAAABBBCCCDDD"
>>> snip_string(string, 1)
'ABCD'
>>> snip_string(string, 2)
'AABBCCDD'
>>> snip_string(string, 3)
'AAABBBCCCDDD'
>>> 

编辑

这是我的解决方案的更新版本,它仅在重复字符的超过n时删除字符

import itertools

def snip_string(string, n):
    groups = [list(g) for k, g in itertools.groupby(string)]
    string_list = []
    for group in groups:
        while len(group) > n:
            del group[-1]
        string_list.extend(group)
    return ''.join(string_list)

输出:

>>> string = "DDDAABBBBCCABCDE"
>>> snip_string(string, 3)
'DDDAABBBCCABCDE'

好的,基于on your comment,您可以对字符串进行预排序,也可以不按您试图创建的函数对其进行排序。使用^{}可以更轻松地执行此操作:

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时,这个函数还使用^{}来创建扁平的字母列表。由于它们都是一个生成器,因此仅在最后一行对其进行求值/展开:

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)

相关问题 更多 >