【问题标题】:Appending a self constructed class in priority que gives TypeError: '<' not supported between instances of 'str' and 'Node'在优先级队列中附加一个自构造类会给出 TypeError: '<' not supported between 'str' and 'Node'
【发布时间】:2021-04-28 13:06:33
【问题描述】:
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() 我不想更改整个代码,而只想更改优先级,以便它仅根据第一个元素(整数)对条目进行优先级。

【问题讨论】:

  • 您在接受字符串的优先级队列中添加一个节点。这就是问题所在。我真的不知道您是否可以在不更改代码的情况下修复它。
  • @LucasBelfanti 我可以在不是问题的优先队列中添加一个节点。当它尝试将 Node 与字符串进行比较以确定优先级时,就会出现问题。因此,它给出了比较是不可能的。此外,从 python 的文档中,我们可以发现两个不同类之间的比较是不可能的。我的论点是优先级 que 的容器允许 Node 但比较运算符正在阻止它。例如,我的优先级队列包括整数和字符串,而不仅仅是字符串。谢谢!

标签: python class typeerror priority-queue huffman-code


【解决方案1】:

你说得对,优先队列不知道如何比较 str 和 Node。您必须重写 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

【讨论】:

  • 谢谢,但我一直在寻找更好的解决方案。跳过整个过程的东西。
  • 好吧,也许你可以避免覆盖其中的一些,例如__ne____eq____ge____le__。我的意思是你必须覆盖优先队列使用的那些,但恐怕它是最 Pythonic 的解决方案。
  • 我想通过两行代码为每个运算符返回 True,或者只使用通用比较运算符。喜欢def __cmp__(self,other)return cmp((self.left), (other.left))。或者,更改优先级列表,使其不经过内部比较。我赞成您的解决方案,因为它很有帮助,但期待其他人。
猜你喜欢
  • 2018-09-08
  • 1970-01-01
  • 2018-04-15
  • 2022-12-06
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多