我正在尝试编写一个函数,该函数将接收一个字符串,并给定一个整数,该函数将删除所有大于该整数的相邻重复项,并输出剩余的字符串。我现在有此函数,该函数将删除字符串中的所有重复项,而且我不确定如何将整数约束放入其中:
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
我还担心非常大的字符串的运行时间和复杂性,因此,如果我的初始方法不好,请提出另一种方法。任何帮助表示赞赏!
答案 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
。
哦,您更改了它...现在,我对输出的“解释”的原始答案实际上是有效的。您可以将groupby
与islice
一起使用,以从每组重复项中获取最多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