2016-05-09 104 views
0

我有一个打印霍夫曼树的代码。正是这一部分:反向打印树级别

while len(numArr) > 1: 
    numArr = [numArr[0] + numArr[1]] + numArr[2:] 
    numArr = sorted(numArr) 
    valHold = numArr[0] * 8 
    print(numArr) 

不介意valHold变量,我用它来计算输入字符串的未压缩位。

比方说,我有1,1,1,2,3,4作为列表numArr(元素来自一个计数器,并转移到letter_ar r和numArr将这两个分开)的元素。

我只能打印它像这样:

1,1,1,1,2,3,4 
1,1,2,2,3,4 
2,2,2,3,4 
2,3,4,4 
4,4,5 
5,8 
13 

有没有一种方法我可以打印它的其他方式?它会更像一棵树的方式?就像这样:

13 
5,8 
4,4,5 
2,3,4,4 
2,2,2,3,4 
1,1,2,2,3,4 
1,1,1,1,2,3,4 

这将是更好,如果你能教我如何与缩进打印:

 13 
    5,8 
    4,4,5 
    2,3,4,4 
    2,2,2,3,4 
1,1,2,2,3,4 
1,1,1,1,2,3,4 

请注意numArr列表的元素没有预先定义。它基于用户在程序中输入的内容。

回答

0

肯定的:

tree = [] 
while len(numArr) > 1: 
    numArr = [numArr[0] + numArr[1]] + numArr[2:] 
    numArr = sorted(numArr) 
    valHold = numArr[0] * 8 
    tree.append(numArr) 

indent = len(tree) 
for row in tree[::-1]: 
    print(" " * indent, row) 
    indent -= 1 
+0

简单但它的作品!非常感谢你。 – Paradigm

0

你可以输出你的树格式的数据如下:

numArray = [ 
    [1, 2, 1, 4, 1, 1, 3], 
    [2, 4, 1, 3, 2, 1], 
    [2, 3, 2, 4, 2], 
    [4, 2, 3, 4], 
    [5, 4, 4], 
    [8, 5], 
    [13]] 

output = [','.join(str(x) for x in sorted(row)) for row in numArray[::-1]] 

for row in output: 
    print row.center(len(output[-1])) 

这将显示:

 13  
    5,8  
    4,4,5  
    2,3,4,4 
    2,2,2,3,4 
1,1,2,2,3,4 
1,1,1,1,2,3,4 

[::-1]可以用来读取数组以相反的顺序。所以这里的想法是读取每一行并将每个元素转换为一个字符串。然后使用逗号将它们连接起来以创建一个数字列表。最后,每行根据最长条目的长度显示居中。

0

为了以相反的顺序打印,您可以先将其放入列表中,然后再将其反转。

array = [] 
while len(numArr) > 1: 
    numArr = [numArr[0] + numArr[1]] + numArr[2:] 
    numArr = sorted(numArr) 
    array.append(numArr) 
array.reverse() 

缩进输出和每个数字对准它可能需要一些额外的工作,但你可以尝试居中输出作为一个变通。 首先将每个列表转换为一个字符串,并计算最大宽度。然后使用str.center来居中文本。

array_str = list(map(lambda level: ','.join(str(i) for i in level), array)) 
width = max(len(s) for s in array_str) 
for s in array_str: 
    print(s.center(width))