在python中删除字符串中的连续重复字符
嘿,我试着写一个程序,从字符串中删除连续的重复字符 例如:在python中删除字符串中的连续重复字符,python,string,duplicates,Python,String,Duplicates,嘿,我试着写一个程序,从字符串中删除连续的重复字符 例如: 字符串->aabbccde 第一次迭代:bbccde 第二次迭代:ccde 第三次迭代:de 而德就是答案 下面是我写的程序 a = "aabbcs" def remove_dups(st,ind): print st, ind st = st.replace(st[ind], "") print st, "in dups" find_dups(st) def find_dups(text):
字符串->aabbccde
第一次迭代:bbccde
第二次迭代:ccde
第三次迭代:de 而德就是答案 下面是我写的程序
a = "aabbcs"
def remove_dups(st,ind):
print st, ind
st = st.replace(st[ind], "")
print st, "in dups"
find_dups(st)
def find_dups(text):
s=text
print s, "in find"
ln = len(s)
print ln
fg = 0
ind = 0
if ln==1:
print s, 'len'
return s
for i in range(0,ln-1):
if(s[i]==s[i+1]):
ind = i
remove_dups(s,ind)
print s, 'check'
return s
ans = find_dups(a)
print 'answer', ans
下面是我得到的结果
查找中的aabbcs6
aabbcs 0
DUP中的BBC
查找中的bbcs
4
bbcs 0
DUP中的cs
查找中的cs
2
cs检查
bbcs检查
aabbcs 2
DUP中的AAC
查找中的aacs
4
aacs 0
DUP中的cs
查找中的cs
2
cs检查
aacs检查
aabbcs检查
回答aabbcs
在这里,我们得到了cs,但答案仍然是原始字符串,我可以理解这是因为递归,但无法理解如何解决这个问题。如果你能帮我一点忙,我将不胜感激。谢谢 您的线路
删除dup(s,ind)
就是问题所在。它没有对返回的值做任何操作。如果通读代码,在顶级函数调用中,您将在顶部指定s=text
,然后在底部返回s
,而不修改s
的值。提示是,在打印正确答案后,您正在最后打印原始文本。请尝试
s=remove\u dup(s,ind)
您的线路remove\u dup(s,ind)
就是问题所在。它没有对返回的值做任何操作。如果通读代码,在顶级函数调用中,您将在顶部指定s=text
,然后在底部返回s
,而不修改s
的值。提示是,在打印正确答案后,您正在最后打印原始文本。尝试
s=remove\u dup(s,ind)
您可以使用re.sub轻松完成此操作
import re
str = "aaaabbcccdddx"
print(re.sub(r"(.)\1+", '', str))
OP
x
使用re.sub
import re
str = "aaaabbcccdddx"
print(re.sub(r"(.)\1+", '', str))
OP
x
python有一些更简单的方法来实现这一点,其中之一是:
>>> dup_string = 'aabcbccde'
>>> from itertools import groupby
>>> ''.join([x for x,y in groupby(dup_string) if sum(1 for i in y)<2])
'bcbde'
>>> dup_string = 'aabbccde'
>>> ''.join([x for x,y in groupby(dup_string) if sum(1 for i in y)<2])
'de'
>>>
dup_string='aabccde'
>>>从itertools导入groupby
>>>''.join([x代表x,y代表groupby(dup_字符串)如果sum(1代表y中的i)>>dup_字符串='aabbccde'
>>>''.join([x代表x,y代表groupby(dup_字符串)如果sum(1代表y中的i)>>
python有一些更简单的方法可以做到这一点,其中之一是:
>>> dup_string = 'aabcbccde'
>>> from itertools import groupby
>>> ''.join([x for x,y in groupby(dup_string) if sum(1 for i in y)<2])
'bcbde'
>>> dup_string = 'aabbccde'
>>> ''.join([x for x,y in groupby(dup_string) if sum(1 for i in y)<2])
'de'
>>>
dup_string='aabccde'
>>>从itertools导入groupby
>>>''.join([x代表x,y代表groupby(dup_字符串)如果sum(1代表y中的i)>>dup_字符串='aabbccde'
>>>''.join([x代表x,y代表groupby(dup_字符串)如果sum(1代表y中的i)>>
您应该返回字符串的值,因为这些值是通过副本传递的。此外,一旦您完成了
删除重复项
,您应该中断,因为您对刚刚修改的内容不再感兴趣
a = "aabbcs"
def remove_dups(st,ind):
print st, ind
st = st.replace(st[ind], "")
print st, "in dups"
return find_dups(st)
def find_dups(text):
s=text
print s, "in find"
ln = len(s)
print ln
fg = 0
ind = 0
if ln==1:
print s, 'len'
return s
for i in range(0,ln-1):
if(s[i]==s[i+1]):
ind = i
s = remove_dups(s,ind)
break
print s, 'check'
return s
ans = find_dups(a)
print 'answer', ans
您应该返回字符串的值,因为这些值是通过副本传递的。此外,一旦完成
remove\u dups
操作,您应该中断,因为您不再对刚才修改的值感兴趣
a = "aabbcs"
def remove_dups(st,ind):
print st, ind
st = st.replace(st[ind], "")
print st, "in dups"
return find_dups(st)
def find_dups(text):
s=text
print s, "in find"
ln = len(s)
print ln
fg = 0
ind = 0
if ln==1:
print s, 'len'
return s
for i in range(0,ln-1):
if(s[i]==s[i+1]):
ind = i
s = remove_dups(s,ind)
break
print s, 'check'
return s
ans = find_dups(a)
print 'answer', ans
如果要递归调用
find_dups
方法,最好去掉for循环。只要在找到连续的重复项后立即删除它们,然后对新返回的字符串再次递归调用find_dups
a = "aabbcs"
def remove_dups(st,ind):
return st.replace(st[ind:ind+1], "")
def find_dups(text, i):
if len(text)-1 == i:
return text
if(text[i]==text[i+1]):
text = remove_dups(text,i)
text = find_dups(text, i)
else:
text = find_dups(text, i+1)
return text
ans = find_dups(a, 0)
print "answer", ans
如果要递归调用
find_dups
方法,最好去掉for循环。只要在找到连续的重复项后立即删除它们,然后对新返回的字符串再次递归调用find_dups
a = "aabbcs"
def remove_dups(st,ind):
return st.replace(st[ind:ind+1], "")
def find_dups(text, i):
if len(text)-1 == i:
return text
if(text[i]==text[i+1]):
text = remove_dups(text,i)
text = find_dups(text, i)
else:
text = find_dups(text, i+1)
return text
ans = find_dups(a, 0)
print "answer", ans
下面是你做这项工作的职责
def remove_duplicates(str):
integer=0
while integer<len(str)-1:
if str[integer]==str[integer+1]:
str=str.replace(str[integer]," ",2)
integer=integer+1
str=str.replace(" ","")
print(str)
def删除重复项(str):
整数=0
而integer下面是你完成这项工作的函数
def remove_duplicates(str):
integer=0
while integer<len(str)-1:
if str[integer]==str[integer+1]:
str=str.replace(str[integer]," ",2)
integer=integer+1
str=str.replace(" ","")
print(str)
def删除重复项(str):
整数=0
对于一般列表,整数:
mylist = [['a'], ['a'], ['a'], ['b'], ['b'], ['c'], ['d'], ['e'], ['f'], ['a'], ['a']]
idx = 0
while True:
if idx == len(mylist) - 1:
break
if mylist[idx] == mylist[idx + 1]:
del mylist[idx + 1]
idx = idx
else:
idx = idx + 1
一般清单:
mylist = [['a'], ['a'], ['a'], ['b'], ['b'], ['c'], ['d'], ['e'], ['f'], ['a'], ['a']]
idx = 0
while True:
if idx == len(mylist) - 1:
break
if mylist[idx] == mylist[idx + 1]:
del mylist[idx + 1]
idx = idx
else:
idx = idx + 1
几乎-您希望'
虽然作为替换字符串,因此输出与OP期望的de
匹配…几乎-您希望'
虽然作为替换字符串,因此输出与OP期望的de
匹配…我怀疑以ded
结尾的字符串将需要ded的输出代码>因为没有直接连续的字母。这将输出de
仍然…并且abcbca
将返回一个空字符串,并且没有任何连续字符…这次应该可以。我怀疑以ded
结尾的字符串将需要输出ded
,因为没有直接连续的字符动态字母。这将输出de
静止…并且abcbca
将返回一个空字符串,并且没有任何连续字符…这次应该可以。谢谢我添加了s=remove\u dups(s,ind)
并且这个s=find\u dups(s)
rest它工作了我添加的s=remove\u dups(s,ind)
这个s=find\u dups
让它工作