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!