因此,我编写了一个快速的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']]
Run Code Online (Sandbox Code Playgroud)
我想要的是
[['s', '10'], ['e', '111'], ['l', '00'], [' ', '101'], ['h', '011'], ['a', '001']]
Run Code Online (Sandbox Code Playgroud)
由于具有高频率的霍夫曼代码具有最短的长度代码,因此我尝试按它们的代码长度对其进行排序,但这并不一定是正确的,因为我的程序允许用户更改它们应以左侧的1还是0开头。为什么代码未排序是绘制霍夫曼树的本质。
您可以使用查找字典来获取密钥:
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)
Run Code Online (Sandbox Code Playgroud)
输出量
[['s', '10'], ['e', '111'], ['l', '00'], [' ', '101'], ['h', '011'], ['a', '001']]
Run Code Online (Sandbox Code Playgroud)