我决定尝试制作一个霍夫曼树计划。到目前为止,我已经设法让它生成所有加权输出的列表(我认为这是正确的),但我很难以可查看的格式显示它。
我搞了一个名为“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"
(显然不清楚'树'事物)