繁体   English   中英

'str'和'Node'的实例之间不支持'<'?

[英]'<' not supported between instances of 'str' and 'Node'?

我正在尝试实现霍夫曼编码算法,但由于优先级队列的比较而不断收到此错误。 我的代码如下:

class Node(object):
    def __init__(self, left=None, right=None):
        self.left = left
        self.right = right
    def children(self):
        return(self.left, self.right)
    def __lt__(self,other):
        return 0

def create_tree(count):
    print(count)
    priority = queue.PriorityQueue()
    for value in count:
        priority.put(value)
    while priority.qsize() > 1:
        one, two = priority.get(), priority.get()
        node = Node(one, two)
        priority.put((one[0]+two[0], node))
    return priority.get()

我已尝试多次尝试在我的HuffmanNode类中使用__lt__但总是最终无法将'str'与'Node','int'或'tuple'进行比较。 我想知道是否可以这样做,任何建议将不胜感激。

编辑:同样算作create_tree是一个元组列表,如下所示:[(1,'a'),(1,'b'),(2,'c')]

应该产生错误的代码:[(1,113),(1,107),(1,98),(1,120),(1,106),(1,118),(1,108),( 1,122),(1,121),(1,100),(1,87),(1,70),(1,10),(2,84),(2,117),(2, 99),(2,111),(2,102),(2,109),(2,97),(2,46),(3,110),(3,112),(4,114) ,(4,115),(4,116),(4,103),(5,104),(5,101),(7,105),(8,111),(18,32)]

还意识到我改变了我的代码,所以它使用ascii值而不是字符串,但我得到相同的错误,无论是'int'还是'str'

这是直接从PriorityQueue的文档中解除的:

首先检索最低值的条目(最低值条目是由sorted(list(entries))[0])返回的sorted(list(entries))[0]) 条目的典型模式是以下形式的元组: (priority_number, data)

如果数据元素不具有可比性,则可以将数据包装在忽略数据项的类中,并仅比较优先级编号。

他们给出的示例代码是:

from dataclasses import dataclass, field
from typing import Any

@dataclass(order=True)
class PrioritizedItem:
    priority: int
    item: Any=field(compare=False)

使用您为count = [(1, 'a'), (1, 'b'), (2, 'c')]提供的示例:

def create_tree(count):
    print(count)
    priority = queue.PriorityQueue()
    for value in count:
        priority.put(value)
    while priority.qsize() > 1:
        one, two = priority.get(), priority.get()  # one == (1, 'a'); two == (1, 'b')
        node = Node(one, two)  # node == Node(left=(1, 'a'), right=(1, 'b'))
        priority.put((one[0]+two[0], node))  #  (2, Node(left=(1, 'a'), right=(1, 'b'))  <== error here
    return priority.get()

当您的代码将(2, Node(left=(1, 'a'), right=(1, 'b'))PriorityQueue时,队列中的另一个元素(2, 'c')具有相同的优先级,因此数据元素用于排序。

因此,您需要显式忽略按数据排序(请参阅上面的文档示例以获取一些指导),或者定义'c'应如何相对于Node(left=(1, 'a'), right=(1, 'b'))排序Node(left=(1, 'a'), right=(1, 'b'))并实施它。 例如,如果您始终希望Node相对于某些其他数据类型排序最后:

def __lt__(self, other):
    return True

def __gt__(self, other):
    return False

或相反亦然:

def __lt__(self, other):
    return False

def __gt__(self, other):
    return True

还是更复杂的东西?

实现__lt__() ,将为Node < int创建比较,但不创建int < Node

为此,我们需要撤消操作:

这些方法没有交换参数版本(当左参数不支持操作但右参数支持时使用); 相反, __lt__()__gt__()是彼此的反射, __le__()__ge__()是彼此的反射,而__eq__()__ne__()是他们自己的反射。

Python数据模型文档

换句话说,当评估B < A ie B.__lt__(A)并且B没有定义合适的__lt__()方法时,它使用A.__gt__(B)代替。

要解决此问题,请将以下内容添加到Node类:

def __gt__(self,other):
    return 0 # or something else intelligent

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM