Eliminar caracteres duplicados consecutivos de una cadena en Python

Hey, estaba intentando escribir un progtwig que eliminaría los caracteres duplicados consecutivos de una cadena.

por ejemplo:
cadena-> aabbccde
primera iteración: bbccde
segunda iteración: ccde
tercera iteración: de

y de es la respuesta.

El siguiente es el progtwig que escribí.

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 

y siguiente es la salida que estoy recibiendo

aabbcs en encontrar
6
aabbcs 0
bbcs en dups
bbcs en encontrar
4
bbcs 0
cs en dups
cs en encontrar
2
cheque cs
cheque de bbcs
aabbcs 2
aacs en dups
aacs en encontrar
4
aacs 0
cs en dups
cs en encontrar
2
cheque cs
cheque de aacs
cheque de aabbcs
contestar aabbcs

aquí arriba tenemos cs, pero aún así la respuesta viene de una cadena original, puedo entender que se debe a una recursión, pero no puedo entender cómo resolver el problema. Un poco de ayuda sería apreciado. ¡Gracias!

Su línea remove_dups(s,ind) es el problema. No está haciendo nada con el valor devuelto. Si leyó todo el código, en la llamada de la función de nivel superior está asignando s=text en la parte superior, y luego devuelve s en la parte inferior, sin modificar nunca el valor de s . La clave es que está imprimiendo el texto original por última vez, después de haber impreso la respuesta correcta.
Prueba s = remove_dups(s, ind)

Python tiene una forma más fácil de hacer esto, una de ellas:

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

Si va a llamar recursivamente al método find_dups , también puede deshacerse del bucle for. Simplemente elimine los duplicados consecutivos tan pronto como los encuentre y, a continuación, find_dups llamar a find_dups nuevamente en la cadena que acaba de devolver.

 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 

Podrías hacerlo fácilmente usando re.sub

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

OP

 x 

Debería devolver los valores de la cadena, ya que estos son pasados ​​por copias. Además, una vez que hayas terminado con remove_dups deberías romper ya que ya no estás interesado en lo mismo que acabas de modificar.

 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 

abajo es tu función hacer el trabajo

 def remove_duplicates(str): integer=0 while integer 

¡Puedes incluir las declaraciones impresas que dejé fuera!