- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEncode.py
More file actions
Latest commit
60 lines (50 loc) · 1.85 KB
/
Copy pathEncode.py
File metadata and controls
60 lines (50 loc) · 1.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
fromitertoolsimportgroupby
fromheapqimport*
# Node para abstração dos nós da heap que vai ser gerada
classNode(object):
esquerda=None
direita=None
dado=None
peso=0
# Metódo construtor pro object Node iniciando dado e peso de cada nó
def__init__(self, d, p):
self.dado=d
self.peso=p
# Método para setar os nós filhos(esquerdo e direito) de cada nó da pilha
defsetChildren(self, ne, nd):
self.esquerda=ne
self.direita=nd
# Método sobreposto pra visualização das informações(print) dentro do nó
def__repr__(self):
return"Dado: "+str(self.dado)+" - Peso: "+str(self.peso)+" - esquerda: "+str(self.esquerda)+" - direita: "+str(self.direita)+"\n"
# Implementaçã de sobrecarga de método LESS THAN necessaria pra verificação da queue no Python3
def__lt__(self, other):
returnself.peso<other.peso
defEncodeHuffman(input, nomeArquivo):
itemqueue= [Node(a,len(list(b))) fora,bingroupby(sorted(input))]
itemqueue=sorted(itemqueue,reverse=True)
whilelen(itemqueue) >1:
e=heappop(itemqueue)
d=heappop(itemqueue)
n=Node(None, d.peso+e.peso)
n.setChildren(e,d)
heappush(itemqueue, n)
codes= {}
defcodeIt(s, node):
ifnode.dado:
ifnots:
codes[node.dado] ="0"
else:
codes[node.dado] =s
else:
codeIt(s+"0", node.esquerda)
codeIt(s+"1", node.direita)
codeIt("",itemqueue[0])
try:
f=open(nomeArquivo+".enc", 'w')
f.write(str(codes)+"\n")
f.write("".join([codes[a] foraininput]))
f.close()
print("Arquivo salvo com sucesso com o nome: "+nomeArquivo+".enc")
except:
print("Erro ao abrir arquivo, tente novamente")