因此,我编写了一个快速的Python程序,用于基于文本文件创建霍夫曼树。到目前为止,一切都很好,除了我介绍产生的霍夫曼代码的方式。为了遵循惯例,我希望将它们从最频繁的显示到最不频繁的显示。幸运的是,我还有另一个存储频率和对应字母的列表。该频率列表已经排序。我的问题是,我不知道要使用哪个键来根据第一张列表中的值对第二张列表进行排序。
frequencies = [[6, 's'], [4, 'e'], [4, 'l'], [3, ' '], [2, 'h'], [1, 'a']]
huffman_codes = [['s', '10'], ['h', '011'], ['e', '111'], [' ', '101'], ['l', '00'], ['a', '001']]
我想要的是
[['s', '10'], ['e', '111'], ['l', '00'], [' ', '101'], ['h', '011'], ['a', '001']]
由于具有高频率的霍夫曼码具有最短的长度代码,因此我尝试按它们的代码长度对其进行排序,但这并不一定是正确的,因为我的程序允许用户更改以1还是0开头左边。为什么代码未排序是绘制霍夫曼树的本质。
答案 0 :(得分:6)
您可以使用查找字典来获取密钥:
frequencies = [[6, 's'], [4, 'e'], [4, 'l'], [3, ' '], [2, 'h'], [1, 'a']]
huffman_codes = [['s', '10'], ['h', '011'], ['e', '111'], [' ', '101'], ['l', '00'], ['a', '001']]
lookup = {y : x for x, y in frequencies}
result = sorted(huffman_codes, key=lambda x: lookup[x[0]], reverse=True)
print(result)
输出
[['s', '10'], ['e', '111'], ['l', '00'], [' ', '101'], ['h', '011'], ['a', '001']]