Python - 从嵌套循环生成霍夫曼树

时间:2018-01-02 22:17:41

标签: python python-3.x tree huffman-code

我决定尝试制作一个霍夫曼树计划。到目前为止,我已经设法让它生成所有加权输出的列表(我认为这是正确的),但我很难以可查看的格式显示它。

我搞了一个名为“Node'”的递归对象,但我知道我做错了什么,输出是荒谬的。我的代码如下:

main.py

import sys

word = ' '.join(sys.argv[1:])

freq = {}

for char in word:
  if char in freq.keys():
    freq[char] += 1
  else:
    freq[char] = 1

freq = [[x, y] for x, y in freq.items()]
freq.sort(key=lambda x: x[1])

while len(freq) != 1:
  freq[1][0] = [freq[0][0], freq[1][0]]
  freq[1][1] = freq[0][1] + freq[1][1]
  freq.pop(0)
  freq.sort(key=lambda x: x[1])

print(freq[0][0])

freq = freq[0][0]

class Node(object):

  value = None

  def __init__(self, li):
    if type(li) not in [tuple, list, set, dict]:
      self.value = li

    else:
      if len(li) != 2:
        raise ValueError('\'Node\' object only takes 2-part iterables or raw values as an argument')
      self.left = Node(li[0])
      self.right = Node(li[1])

  def __repr__(self):
    if self.value != None:
      return '"' + str(self.value) + '"'

    return ' ' * self.left.size() + '|' + self.right.size() * ' ' + '\n' + str(self.left) + str(self.right)

  def size(self):
    if self.value != None:
      return 1

    return self.left.size() + self.right.size()

n = Node(freq)
print(n)

我目前对我的实际Huffman创建代码中的错误并不感到困扰,因为一旦我可以更好地查看输出,我就会更容易回过头来修复这些错误。

示例进/出:

she sells sea shells on the sea shore产生:

[[' ', ['h', 'l']], ['s', [[['t', ['n', 'r']], ['a', 'o']], 'e']]]

,或者

   |
 |
" " |
"h""l" |
"s"     |
   |
 |
"t" |
"n""r" |
"a""o""e"

(显然不清楚'树'事物)

0 个答案:

没有答案