2016-05-09 102 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))