codificar letras repetidas en una cadena con número

Una cadena ‘abc’ debe convertirse en ‘a1b1c1’. Cadena ‘aaabcca’ – ‘a3b1c2a1’

Escribí la función python, pero no agrega la última letra y ‘abc’ es solo ‘a1b1’.

string = "aaabbcc" coded = '' if len(string) == 0: print('') else: count = 1 #start with the first char, not zero! prev = string[0] for i in range(1,len(string)): current = string[i] if current == prev: count +=1 else: coded += prev coded += str(count) count = 1 prev = current print("coded string: " + coded) print(coded) 

Te olvidas de agregar explícitamente la última iteración.

 string = "aaabb" coded = '' if len(string) == 0: print('') else: count = 1 #start with the first char, not zero! prev = string[0] for i in range(1,len(string)): current = string[i] if current == prev: count +=1 else: coded += prev coded += str(count) count = 1 prev = current coded += prev # these two coded += str(count) # lines print(coded) 

Sin embargo, preferiría un bucle menos complicado:

 string = "aaabbcc" coded = '' while string: i = 0 while i < len(string) and string[0] == string[i]: i += 1 coded += string[0]+str(i) string = string[i:] print(coded) 

Utilice itertools.groupby .

 >>> from itertools import groupby >>> s = 'aaabcca' >>> ''.join('{}{}'.format(c, sum(1 for _ in g)) for c, g in groupby(s)) 'a3b1c2a1' 

Detalles sobre lo que groupby produce:

 >>> groups = groupby(s) >>> [(char, list(group)) for char, group in groups] [('a', ['a', 'a', 'a']), ('b', ['b']), ('c', ['c', 'c']), ('a', ['a'])] 

Un poco de magia regex :

 import re s = 'aaawbbbccddddd' counts = re.sub(r'(.)\1*', lambda m: m.group(1) + str(len(m.group())), s) print(counts) 

La salida:

 a3w1b3c2d5 

Detalles :

patrón regex:

  • (.) – Capturando un personaje . (cualquier char) en el 1er grupo capturado
  • \1* – coincide con cero o más consecutivo \1 que es una referencia al primer valor de grupo capturado (que coincide con una posible secuencia del mismo carácter)

reemplazo:

  • m.group(1) – contiene el primer valor de grupo coincidente
  • str(len(m.group())) : obtiene la longitud de toda la secuencia de caracteres coincidente

Si se pregunta por qué su código no funcionó o no quiere usar ninguna biblioteca externa, aquí está la versión de trabajo de su código.

 string = "aaabbcc" coded = '' if len(string) == 0: print('') else: count = 0 prev = string[0] for i in range(1,len(string)): current = string[i] count +=1 if current != prev: coded += prev coded += str(count) count = 0 prev = current coded += current coded += str(count+1) print(coded) # -> a3b2c2