TypeError:无序类型:Tree()<;int()(在Python 2中运行良好)

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 很

我在Python2中运行了这个Huffman编码代码,它工作得很顺利。然而,在Python3中,它给了我一个如上所述的错误。我知道这些类型是不一样的(因此是不可比较的),但是我应该如何解决这个问题呢

请注意,错误在
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))