在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
下面是我得到的结果

查找中的aabbcs
6
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
让它工作