我试图通过'Rosetta代码'来理解用python编写的霍夫曼代码。以下是代码中的一小部分。
def encode(symb2freq):
heap = [[wt, [sym, ""]] for sym, wt in symb2freq.items()] #What does this do?
我假设变量heap
是一个列表。但wt
和sym
是什么?
答案 0 :(得分:3)
sym2freq
是一个字典,键上有一些符号,它们的值是符号的频率。例如,如果您有字符串'aaabacba',则字典将如下所示
sym2freq = {'a': 5, 'b': 2, 'c': 1}
那是因为我们有5倍的字母a,2倍的字母b和1倍的字母c。
字典具有方法items()
,它将返回每个键的元组及其各自的值。在我们的例子中,它会返回
>>> sym2freq.items()
(('a', 5), ('b', 2), ('c', 1))
理解列表的for sym, wt in symb2freq.items()
部分只是解包。每次我们从上面获取一个元组时,我们将第一个对象分配给变量sym
,将第二个对象分配给变量wt
。选择名称sym和wt纯粹是为了反映代表的值,即符号和重量(频率)。
>>> sym, wt = ('a', 5)
>>> print sym
'a'
>>> print wt
5
由于列表理解会创建结构[wt, [sym, ""]]
的列表,因此您最终会得到列表
>>> encode(sym2freq)
[[5, ['a', '']], [2, ['b', '']], [1, ['c', '']]]
我们从符号频率字典到列表heap
这样的结构的原因是我们可以根据频率对符号进行分类,正如您所了解的那样,它们是构建符号的一部分。霍夫曼树。
答案 1 :(得分:2)
这是list comprehension。这是说
symb2freq
的项目并开始循环播放。symb2freq
中的第一项,并将其解压缩为变量sym
和wt
。[wt, [sym, ""]]
添加到列表heap
例如,[bar(x) for x in foo]
会生成一个列表,将bar(x)
应用于列表中的每个值。
答案 2 :(得分:-1)
这是一个有趣的问题。想象一下有五个字母的字典,其中键是字母,值是频率:
a = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
然后将其映射,使其成为具有频率的列表列表,以及以字母开头的列表,如下所示:
[[1, ['a', '']], [2, ['b', '']], [3, ['c', '']], [4, ['d', '']], [5, ['e', '']]]
然后当你堆积它时,你得到:
[[1, ['a', '']],
[3, ['c', '']],
[2, ['b', '']],
[5, ['e', '']],
[4, ['d', '']]]
只需使用有效的字典逐步处理,就像维基百科页面上给出的那样进行编码,然后您就可以看到每个步骤的作用。或者使用一个简单的例子来开始像我给的那样,慢慢增加元素的数量,直到你使用真实的文档。
rosetta代码正在做的是迭代堆并将数字添加到基于频率的字母后面看到的空白字符串,直到每个字母映射到二进制解释。所以最后你会有这样的事情:
[['e', '101'],
['d', '010'],
['c', '1001'],
['b', '1100'],
['a', '1101']]
最频繁的字母需要最少的位。
答案 3 :(得分:-3)
sym是符号,wt是权重。