根据条件删除相邻的重复项

时间:2019-02-11 17:35:50

标签: python python-3.x string

我正在尝试编写一个函数,该函数将接收一个字符串,并给定一个整数,该函数将删除所有大于该整数的相邻重复项,并输出剩余的字符串。我现在有此函数,该函数将删除字符串中的所有重复项,而且我不确定如何将整数约束放入其中:

def remove_duplicates(string):
    s = set()
    list = []
    for i in string:
        if i not in s:
            s.add(i)
            list.append(i)

    return ''.join(list)

string = "abbbccaaadddd"
print(remove_duplicates(string))

这将输出

  

abc

我想要的是类似的功能

def remove_duplicates(string, int):
    .....

如果对于同一字符串,我输入int = 2,我想删除我的n个字符而不删除所有字符。输出应为

  

abbccaadd

我还担心非常大的字符串的运行时间和复杂性,因此,如果我的初始方法不好,请提出另一种方法。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:3)

不确定我是否正确理解了您的问题。我认为,考虑到m个字符的重复,您希望删除k*n个重复项,以使k*n < m重复。

您可以尝试使用groupby

>>> from itertools import groupby
>>> string = "abbbccaaadddd"
>>> n = 2
>>> ''.join(c for k, g in groupby(string) for c in k * (len(list(g)) % n or n))
'abccadd'

在这里,k * (len(list(g)) % n or n)表示len(g) % n重复,如果该数字是n,则0


哦,您更改了它...现在,我对输出的“解释”的原始答案实际上是有效的。您可以将groupbyislice一起使用,以从每组重复项中获取最多n个字符。

>>> from itertools import groupby, islice
>>> string = "abbbccaaadddd"
>>> n = 2
>>> ''.join(c for _, g in groupby(string) for c in islice(g, n))
'abbccaadd'

答案 1 :(得分:1)

创建字母组,但计算字母组的长度,该长度由参数决定。

然后重建组并加入:

import itertools

def remove_duplicates(string,maxnb):
    groups = ((k,min(len(list(v)),maxnb)) for k,v in itertools.groupby(string))
    return "".join(itertools.chain.from_iterable(v*k for k,v in groups))

string = "abbbccaaadddd"
print(remove_duplicates(string,2))

此打印:

abbccaadd

也可以是单线的(遮住眼睛!)

return "".join(itertools.chain.from_iterable(v*k for k,v in ((k,min(len(list(v)),maxnb)) for k,v in itertools.groupby(string))))

不确定min(len(list(v)),maxnb)的重复值是否可以通过模(如len(list(v)) % maxnb)来适应您的需求,等等...

答案 2 :(得分:1)

您应该避免使用int作为变量名称,因为它是python关键字。

这是完成任务的香草函数:

def deduplicate(string: str, treshold: int) -> str:
    res = ""
    last = ""
    count = 0
    for c in string:
        if c != last:
            count = 0
            res += c
            last = c
        else:
            if count < treshold:
                res += c
                count += 1
    return res