基于频度if字母Huffman算法的排序表

2024-04-25 18:22:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道如何按升序排列字母列表及其频率,即{'z':1, 'g':3, 'a':5, and so on}

我试图用Python重新创建Huffman算法,一种无损压缩算法。txt是一个文本字符串,它被拆分,因此每个字母(包括空格)都是一个单独的索引。我试过使用Counter(txt),它可以找到每个字母在txt中出现的次数,并创建一个字典。但是这将字典从最高频率排序到最低频率,我需要它从最低频率排序到最高频率,这样它就遵循了哈夫曼算法的步骤。然后我试着添加

for key, value in sorted(freq.iteritems(), key=lambda(k,v): (v,k)):
    print("%s: %s" % (key, value))

但是这会产生语法错误,我不知道这是不是最好的方法。你知道吗

这是我的密码:

from collections import Counter
def huffman(file):
    txt = list(map(lambda c2: c2, file)) # Places each individual char into array.
    freq=Counter(txt) #Counts numb of times a letter appears.
    print(freq)
    for key, value in sorted(freq.iteritems(), key=lambda(k,v): (v,k)):
        print("%s: %s" % (key, value))

我只需要freq字典从最不常见到最常见的顺序,以便它遵循哈夫曼算法的步骤。所以它不是{'a':5, 'g':3, 'z':1},而是{'z':1, 'g':3, 'a':5}


Tags: lambdakeyintxt算法for字典排序
2条回答

在python 3.6或更低版本上,使用以下命令:

from collections import OrderedDict freq = OrderedDict(sorted(freq.items(), key=lambda x: x[1]))

从python版本3.7开始,您可以使用以下命令:
freq = dict(sorted(freq.items(), key=lambda x: x[1]))

从版本3.7和更高版本开始的听写默认情况下是按顺序排列的。 每个元组的第一个元素是字母表,第二个元素是频率。因此,在排序函数中,我们使用每个元素的频率作为关键字,按递增顺序对元素进行排序。你知道吗

如果你真的想要一本订好的词典,你就得跳过几个圈套:)

首先要对词典进行排序,以获得一个平面列表:

import operator
a = {'a':5, 'g':3, 'z':1}
sorted_list = sorted(a.items(), key=operator.itemgetter(1))

然后,你把它传给一个订购的信息:

from collections import OrderedDict
ordered_dict = OrderedDict(sorted_list)

订单号:

OrderedDict([('z', 1), ('g', 3), ('a', 5)])

然后,您可以这样索引:

ordered_dict['z']

输出:

1

相关问题 更多 >

    热门问题