从python中的字符串中删除连续的重复字符

时间:2016-11-20 13:52:33

标签: python string duplicates

嘿我正在尝试编写一个程序,它将从字符串中删除连续的重复字符。

例如:
与字符串> aabbccde
第一次迭代:bbccde
第二次迭代:ccde
第三次迭代:de

和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 in find
6
aabbcs 0
bbcs in dups
bbcs in find
4
bbcs 0
cs in dups
cs在找到 2
cs检查
bbcs检查
aabbcs 2
重复的aacs
找到的aacs 4
aacs 0
cs in dups
cs在找到 2
cs检查
aacs检查
aabbcs检查
回答aabbcs

上面我们有cs但仍然回答是原来的字符串,我可以理解它是因为递归,但无法理解如何解决问题。一点帮助将不胜感激。谢谢!

7 个答案:

答案 0 :(得分:3)

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'
>>> 

答案 1 :(得分:2)

如果你要递归调用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

答案 2 :(得分:1)

您的第remove_dups(s,ind)行是问题所在。它没有对返回的值做任何事情。如果您仔细阅读了代码,则在顶级函数调用中,您将在顶部分配s=text,然后在底部返回s,而无需修改s的值。线索是,在打印完正确的答案后,最后打印原始文本 试试s = remove_dups(s, ind)

答案 3 :(得分:1)

您可以使用re.sub

轻松完成
import re
str = "aaaabbcccdddx"
print(re.sub(r"(.)\1+", '', str))

<强> OP

x

答案 4 :(得分:1)

您应该返回字符串的值,因为它们是通过副本传递的。此外,一旦完成remove_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

答案 5 :(得分:0)

贝娄是你完成这项工作的职责

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)

你可以包括我遗漏的打印陈述!

答案 6 :(得分: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