[英]'<' 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__()
是他们自己的反射。
换句话说,当评估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.