Python 在优先级que中附加一个自建类会导致TypeError:'<';在';str';和';节点';

Python 在优先级que中附加一个自建类会导致TypeError:'<';在';str';和';节点';,python,class,typeerror,priority-queue,huffman-code,Python,Class,Typeerror,Priority Queue,Huffman Code,在此,我在while loop中得到一个错误,经过几次操作后,它无法使用方法q.get(),或q.put()。 例如,Huffman('aadcidcvushdushahdhiad').encoding() 我不想更改整个代码,只想更改优先级,使其仅根据第一个元素(整数)对条目进行优先级排序。没错,优先级队列不知道如何将str与节点进行比较。您必须重写节点类中的比较器函数,以便让优先级队列知道如何比较两种不同的类型 示例(根据需要更改比较器): 类节点(对象): def uuu init uuu

在此,我在while loop中得到一个错误,经过几次操作后,它无法使用方法q.get(),或q.put()。 例如,
Huffman('aadcidcvushdushahdhiad').encoding()

我不想更改整个代码,只想更改优先级,使其仅根据第一个元素(整数)对条目进行优先级排序。

没错,优先级队列不知道如何将str与节点进行比较。您必须重写节点类中的比较器函数,以便让优先级队列知道如何比较两种不同的类型

示例(根据需要更改比较器):

类节点(对象):
def uuu init uuuu(self,data=None):
self.value=数据
self.right=无
self.left=无
定义(自我、目标):
“selfobj
定义(自我,obj):
“”“self>=obj。”“”
返回self.value>=obj

您正在接受字符串的优先级队列中添加节点。这就是问题所在。我真的不知道你是否可以在不改变代码的情况下修复它。@LucasBelfanti我可以在优先级队列中添加一个没有问题的节点。当它试图将节点与字符串进行比较以确定优先级时,会出现问题。因此,它给出了不可能进行比较的结论。另外,从python的文档中,我们可以发现两个不同类之间的比较是不可能的。我的论点是优先级为que的容器允许节点,但比较运算符正在停止它。例如,我的优先级包括整数和字符串,而不仅仅是字符串。谢谢谢谢,但我在寻找更好的解决方案。跳过整个过程的东西。好吧,也许你可以避免覆盖其中的一些,例如
\uuu ne\uuuuuu
\uuuuu eq\uuuu
\uu ge\uuuu
\uu le\uuuu
。我的意思是你必须覆盖优先级队列使用的那些,但恐怕这是最具python风格的解决方案。我想通过两行代码为每个运算符返回True,或者只使用一个通用比较运算符。类似于
def\uu-cmp\uu(self,other)
返回cmp((self.left),(other.left))
。或者,更改优先级列表,使其不经过内部比较。我对你的解决方案投了赞成票,因为它很有帮助,但也期待着其他人。
import sys
from queue import PriorityQueue

class Node(object):
    def __init__(self, data = None):
        self.value = data
        self.right = None
        self.left = None

class Huffman():
    def __init__(self, data):
        self.data = data
    
    def encoding(self):
        my_dict = {}
        for i in self.data:
            my_dict[i] = my_dict.get(i, 0)+1
        q = PriorityQueue()
        for i, j in my_dict.items():
            q.put((j,i))
        while q.qsize() >= 2:
            val_1 = q.get()
            val_2 = q.get()
            new_node_1 = Node(val_1[0]+val_2[0])
            if isinstance(val_1[1], str):
                new_node_1.left = val_1[1]
            else:
                new_node_1.left = val_1[1]
            if isinstance(val_2[1], str):
                new_node_1.right = val_2[1]
            else:
                new_node_1.right = val_2[1]
            q.put((new_node_1.value, new_node_1))
class Node(object):
    def __init__(self, data=None):
        self.value = data
        self.right = None
        self.left = None

    def __lt__(self, obj):
        """self < obj."""
        return self.value < obj

    def __le__(self, obj):
        """self <= obj."""
        return self.value <= obj

    def __eq__(self, obj):
        """self == obj."""
        return self.value == obj

    def __ne__(self, obj):
        """self != obj."""
        return self.value != obj

    def __gt__(self, obj):
        """self > obj."""
        return self.value > obj

    def __ge__(self, obj):
        """self >= obj."""
        return self.value >= obj