代码之家  ›  专栏  ›  技术社区  ›  DavalliTV

基于中频字母频率的排序表——哈夫曼算法

  •  0
  • DavalliTV  · 技术社区  · 5 年前

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

    我试图用Python重新创建哈夫曼算法,一种无损压缩算法。 txt 是一个文本字符串,它被拆分,因此每个字母(包括空格)都是一个单独的索引。我试过使用 Counter(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}

    2 回复  |  直到 5 年前
        1
  •  2
  •   taurus05    5 年前

    在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及以上版本开始的口述命令是按顺序排列的。

        2
  •  0
  •   LeKhan9    5 年前

    如果你真的想拿回一本有序的词典,你就得跳过几个障碍:)

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

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

    然后,您将其传递给OrderedDict:

    from collections import OrderedDict
    ordered_dict = OrderedDict(sorted_list)
    

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

    然后,您可以按如下方式编制索引:

    ordered_dict['z']
    

    1