TypeError:无序类型:Tree()<;int()(在Python 2中运行良好)
我在Python2中运行了这个Huffman编码代码,它工作得很顺利。然而,在Python3中,它给了我一个如上所述的错误。我知道这些类型是不一样的(因此是不可比较的),但是我应该如何解决这个问题呢 请注意,错误在TypeError:无序类型:Tree()<;int()(在Python 2中运行良好),python,Python,我在Python2中运行了这个Huffman编码代码,它工作得很顺利。然而,在Python3中,它给了我一个如上所述的错误。我知道这些类型是不一样的(因此是不可比较的),但是我应该如何解决这个问题呢 请注意,错误在q.put((kiri[0]+kanan[0],node))中明确指出,我认为问题在于优先级队列中的比较 导致错误的输入示例: 3 1 2 3 第一行是指字符数。下一行显示第一个字符、第二个字符的频率,依此类推 请注意,如果第一行小于3,代码会以某种方式运行。例如: 2 1 2 很
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]])
基本问题是,您正在将不同的类型推送到树节点中。有序对(2元组)的第二个元素是一个整数,只要您有一个简单的树。但是,当您到达子节点(孙子节点)时,尝试使用
树
对象作为第二个元素
排序到树中需要定义良好的顺序。树
和int
没有这样的顺序
非常简单,您必须决定其他元素应该是什么,并在数据处理中保持一致。以下是一些基本的调试工具:
for nilai in freq:
print("nilai insert", nilai)
q.put(nilai)
size = q.qsize()
for i in range(size,1,-1):
kanan = q.get()
kiri = q.get()
node = Tree(kanan,kiri)
new_val = kiri[0] + kanan[0]
print("1st", new_val)
print("2nd", node)
q.put((new_val,node))
3-1-2-3案件的执行:
$ python3 so.py
3
1
2
3
nilai insert (1, 1)
nilai insert (2, 2)
nilai insert (3, 3)
1st 3
2nd <__main__.Tree object at 0x7efd60c9a160>
Traceback (most recent call last):
File "so.py", line 40, in <module>
q.put((new_val,node))
File "/usr/lib64/python3.4/queue.py", line 146, in put
self._put(item)
File "/usr/lib64/python3.4/queue.py", line 230, in _put
heappush(self.queue, item)
TypeError: unorderable types: Tree() < int()
及
其中第二个元素是一个
树
我在代码中没有看到小于符号。在哪里进行比较?@JohnGordon哦,是的,对不起,我应该说得更具体些。错误在q.put((kiri[0]+kanan[0],node))中指出,因此我相信这是对StackOverflow的优先级比较。请按照您创建此帐户时的建议,阅读并遵循帮助文档中的发布指南。适用于这里。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。您发布的代码不是最小的:它挂起,等待输入。这表明代码不是最小的。如果您的代码在python2中工作,那么这只是偶然的。毫无疑问,像比较树
和int
这样的无意义操作是bug的症状,无论您是否检测到它。
q.put(nilai) # Simple pair, such as (1, 1)
q.put((new_val,node))