我在 python 2 中运行了这个霍夫曼编码代码,它运行顺利。但是,在 python 3 中,它给了我一个如上所述的错误。我知道类型不相同(因此无法比较)但我应该如何解决这个问题?
请注意,该错误特别指出q.put((kiri[0]+kanan[0],node)),我认为问题在于优先级队列中的比较。
导致错误的输入示例:
3
1
2
3
第一行是指字符数。接下来的几行显示第一个字符、第二个字符等的频率。
请注意,如果第一行小于 3,代码会以某种方式运行。例如:
2
1
2
工作得很好
任何帮助是极大的赞赏。谢谢!
n=list(map(int, input().split()))
n=n[0]
li=[None]*n
for i in range(n):
inp=list(map(int, input().split()))
li[i]=inp[0]
char=[None]*n
index=1
for i in range(n):
char[i]=index
index+=1
freq=list(zip(li,char))
import queue
class Tree:
def __init__(self,kanan,kiri):
self.kanan=kanan
self.kiri=kiri
def anak(self):
return int((self.kanan,self.kiri))
q=queue.PriorityQueue()
for nilai in freq:
q.put(nilai)
size=q.qsize()
for i in range(size,1,-1):
kanan=q.get()
kiri=q.get()
node=Tree(kanan,kiri)
q.put((kiri[0]+kanan[0],node))
huffmantree=q.get()
def traverse(huffmantree,st,pref):
if isinstance(huffmantree[1].kanan[1],Tree):
traverse(huffmantree[1].kanan,st,pref+"0")
else: st[huffmantree[1].kanan[1]]=pref+"0"
if isinstance(huffmantree[1].kiri[1],Tree):
traverse(huffmantree[1].kiri,st,pref+"1")
else: st[huffmantree[1].kiri[1]]=pref+"1"
return st
binarystring=traverse(huffmantree,{},"")
for i in freq: print(binarystring[i[1]])
相关分类