繁体   English   中英

python霍夫曼编码异常不可归类型

[英]python huffman coding Exception Unorderable Types

我正在尝试使用http://en.literateprograms.org/Huffman_coding_%28Python%29中的代码在Python 3中编写霍夫曼编码,但它不起作用。 如果我在Python 2.7中运行代码,它运行良好。

以下几行是问题:

heapq.heapify(trees)
while len(trees) > 1:
    childR, childL = heapq.heappop(trees), heapq.heappop(trees)
    parent = (childL[0] + childR[0], childL, childR)
    heapq.heappush(trees, parent)

TypeError in heapq.heappush(u,parent): "unorderable types: tuple() < str()"得到一个TypeError in heapq.heappush(u,parent): "unorderable types: tuple() < str()"

所以我搜索了一个解决方案,我想,我必须实现一个_ lt _函数。 可能两个或多个节点具有相同的频率,然后heapq尝试比较元组,我认为,他无法比较元组的元组。 但我不知道我在哪里以及如何创建一个比较方法来解决这个问题? 有人可以帮忙吗? ;-)

我只是遇到了完全相同的问题,将一些旧的代码从Python 2移植到Python 3,以及使用heapq的Huffman编码算法。 问题确实是,有时堆中的两个条目具有相同的概率,但是一旦合并了一些符号,就会形成结构不同的“元组树”。

示例:如果堆包含(0.2, ("A", "B))(0.2, (("C", "D"), "E")))则Python会尝试比较字符串和元组.Python 2只会根据类型名称“排序”不匹配的类型,这没有多大意义,但也不会妨碍算法。另一方面,Python 3更严格并引发异常。

我的解决方法是在累积概率和“元组树”之间向元组中添加另一个元素,以避免实际值被比较。 您可以使用,例如,元组的hashrepr ,或一些随机数或不断增加的计数器。

我知道这是一个非常丑陋的黑客,但除非你想用一些自定义__cmp__函数定义你自己的树节点类,这似乎是唯一的方法。 如果有人有更好的想法,请随时发表评论。

原因是在python3x中你无法比较两种不同类型的项目:

>>> "foo" < 1
Traceback (most recent call last):
  File "<ipython-input-5-de2fb49cc8c4>", line 1, in <module>
    "foo" < 1
TypeError: unorderable types: str() < int()

暂无
暂无

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

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