Crear una función de compresión en Python?

Necesito crear una función llamada comprimir que comprima una cadena reemplazando cualquier letra repetida con una letra y un número. Mi función debería devolver la versión abreviada de la cadena. He podido contar el primer personaje pero ningún otro.

Ex:

>>> compress("ddaaaff") 'd2a3f2' def compress(s): count=0 for i in range(0,len(s)): if s[i] == s[i-1]: count += 1 c = s.count(s[i]) return str(s[i]) + str(c) 

Aquí hay una breve implementación en python de una función de compresión:

 def compress(string): res = "" count = 1 #Add in first character res += string[0] #Iterate through loop, skipping last one for i in range(len(string)-1): if(string[i] == string[i+1]): count+=1 else: if(count > 1): #Ignore if no repeats res += str(count) res += string[i+1] count = 1 #print last one if(count > 1): res += str(count) return res 

Aquí están algunos ejemplos:

 >>> compress("ddaaaff") 'd2a3f2' >>> compress("daaaafffyy") 'da4f3y2' >>> compress("mississippi") 'mis2is2ip2i' 

Versión corta con generadores:

 from itertools import groupby def compress(string): return ''.join('%s%s' % (char, sum(1 for _ in group)) for char, group in groupby(string)).replace('1', '') 

(1) Agrupación por caracteres con groupby(string)

(2) Cuenta de la longitud del grupo con la sum(1 for _ in group) (porque no es posible len en el grupo)

(3) Unirse al formato adecuado

(4) Eliminando 1 caracteres para artículos individuales

Hay varias razones por las que esto no funciona. Realmente necesitas intentar depurar esto tú mismo primero. Poner en unas pocas instrucciones de impresión para rastrear la ejecución. Por ejemplo:

 def compress(s): count=0 for i in range(0, len(s)): print "Checking character", i, s[i] if s[i] == s[i-1]: count += 1 c = s.count(s[i]) print "Found", s[i], c, "times" return str(s[i]) + str(c) print compress("ddaaaff") 

Aquí está la salida:

 Checking character 0 d Found d 2 times Checking character 1 d Found d 2 times Checking character 2 a Found a 3 times Checking character 3 a Found a 3 times Checking character 4 a Found a 3 times Checking character 5 f Found f 2 times Checking character 6 f Found f 2 times f2 Process finished with exit code 0 

(1) Usted desecha los resultados de todos, excepto la búsqueda de la última letra. (2) Se cuentan todas las ocurrencias, no solo las consecutivas. (3) Convierte una cadena en una cadena – redundante.

Trate de trabajar a través de este ejemplo con lápiz y papel. Anote los pasos que utiliza, como ser humano, para analizar la cadena. Trabaja en traducir esos a Python.

 x="mississippi" res = "" count = 0 while (len(x) > 0): count = 1 res= "" for j in range(1, len(x)): if x[0]==x[j]: count= count + 1 else: res = res + x[j] print(x[0], count, end=" ") x=res 

Solo otra forma más simple de realizar esto:

 def compress(str1): output = '' initial = str1[0] output = output + initial count = 1 for item in str1[1:]: if item == initial: count = count + 1 else: if count == 1: count = '' output = output + str(count) count = 1 initial = item output = output + item print (output) 

Lo que da la salida como se requiere, ejemplos:

 >> compress("aaaaaaaccddddeehhyiiiuuo") a7c2d4e2h2yi3u2o >> compress("lllhhjuuuirrdtt") l3h2ju3ir2dt >> compress("mississippi") mis2is2ip2i 
 input = "mississippi" count = 1 for i in range(1, len(input) + 1): if i == len(input): print(input[i - 1] + str(count), end="") break else: if input[i - 1] == input[i]: count += 1 else: print(input[i - 1] + str(count), end="") count = 1 

Salida: m1i1s2i1s2i1p2i1

 s=input("Enter the string:") temp={} result=" " for x in s: if x in temp: temp[x]=temp[x]+1 else: temp[x]=1 for key,value in temp.items(): result+=str(key)+str(value) 

imprimir (resultado)