Last active
December 16, 2015 02:39
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import networkx as netx | |
import matplotlib.pyplot as grafica #Con este se genera la grafica \o/ | |
def arbol(Lista): | |
G = netx.Graph() | |
lista1 = list(Lista) | |
lista2 = list() | |
i = 1 | |
for i in range(len(Lista) - 1): | |
pu = list([lista1.pop(0)]) | |
var1, var2 = pu[0][0], pu[0][1] | |
pu = list([lista1.pop(0)]) | |
var3, var4 = pu[0][0], pu[0][1] | |
d1 = 0 | |
d2 = 0 | |
if var2 > var4: #Si el primer valor es mayor | |
d1 = 1 | |
d2 = 0 | |
else: #Si el segundo valor es mayor | |
d1 = 0 | |
d2 = 1 | |
lista2.append((var1, d1)) | |
lista2.append((var3, d2)) | |
c = var1+''+var3 | |
d = var2 + var4 | |
G.add_node(var1) | |
G.add_node(var3) | |
G.add_node(c) | |
G.add_edge(c, var1, color='blue') | |
G.add_edge(c, var3, color='blue') | |
puddi = lista1 | |
lista1 = list([(c, d)]) | |
for i in puddi: | |
lista1.append(i) | |
lista1 = ordenar2(lista1) | |
netx.draw(G) | |
#grafica.show() #Con este muestro en pantalla | |
grafica.savefig("Hola.png") #Con este genero el grafo en una imagen | |
return lista1, lista2 | |
def ordenar2(lista): | |
dicc = ({}) | |
for i, j in lista: | |
dicc[i] = j | |
lista1 = sorted(dicc.items(), key=lambda x: x[1]) | |
return lista1 | |
def final(elementos, palabras): | |
lisfi = ({}) | |
lista = elementos | |
for i in range(len(elementos)): | |
s = list(lista.pop(-1)) | |
var1, var2 = s[0], s[1] #Var1 es la palabra, y var2 es el valor (0 o 1) | |
for j in palabras: | |
if var1.find(j) != -1: | |
if lisfi.has_key(j) == True: #Si la letra ya esta en el diccionario | |
valor = lisfi[j] | |
valor = str(valor)+str(var2) | |
lisfi[j] = valor | |
else: | |
lisfi[j] = str(var2) | |
return lisfi | |
def atras(lista, comprimido): | |
var1 = '' | |
var2 = 0 | |
palabra = '' | |
for i in comprimido: | |
if var2 == 0: | |
var1 = var1 + i | |
for l in lista.keys(): | |
j = lista[l] | |
if var1 == j: | |
var1 = '' | |
palabra = palabra + l | |
var2 == 1 | |
else: | |
var2 == 0 | |
return palabra | |
def datos(lista): | |
lista1 = list() | |
for i, j in lista: | |
lista1.append(i) | |
return lista1 | |
def ordenar(dicc): | |
dicc2 = sorted(dicc.items(), key=lambda x: x[1]) #Le los elementos del diccionario y los ordena de menor a mayor segun el valor de las claves | |
return dicc2 | |
def contador(frase): | |
lista = list(frase) | |
lista2 = lista | |
dicc = ({}) | |
for i in range(len(lista2)): | |
a = lista.pop(0) | |
if dicc.has_key(a) == True: | |
valor = dicc[a] | |
dicc[a] = valor + 1 | |
else: | |
dicc[a] = 1 | |
return dicc | |
def main(): | |
frase = raw_input('Frase a comprimir: ') | |
diccionario = contador(frase) | |
print 'Cantidad de letras en la frase: '+str(diccionario) | |
diccionario = ordenar(diccionario) | |
print 'Lista de Letras Ordenadas: '+str(diccionario) | |
diccionario = list(diccionario) | |
d, a = arbol(diccionario) #Se manda llamar el metodo arbol y recibe dos variables ... | |
print '\nResultado del Arbol: '+str(a) | |
palabras = datos(diccionario) #Este metodo separa el diccionario en una lista | |
ListaFinal = final(a, palabras) | |
print 'Binario: '+str(ListaFinal) | |
compri = '' | |
Lista = list(frase) #Se separa la frase en una lista | |
for i in Lista: | |
compri = compri+ListaFinal[i] #Se obtiene el binario del diccionario utilizando la letra de la frase y se almacena a compri | |
compri = compri.replace(' ', '') | |
print 'Comprimido : '+str(compri) | |
desprin = atras(ListaFinal, compri) | |
print 'Descomprimido: '+str(desprin) | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment