在优先级 que 中附加自构造类会导致 TypeError: 'str' 和 'Node' 的实例之间不支持 '<'

问题描述

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))

在这里,我在 while 循环 中遇到错误,经过几次操作后,它无法使用 q.get()q 方法。放()。 例如,Huffman('AADCIDCVUSHDUSHUSAHDIADHIAD').encoding() 我不想更改整个代码,而只想更改优先级,使其仅根据第一个元素(整数)优先考虑条目。

解决方法

你是对的,优先级队列不知道如何将 str 与节点进行比较。您必须覆盖 Node 类中的比较器函数,让优先级队列知道如何比较两种不同的类型。

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

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