2016-05-09 3 views
0

私はハフマンツリーを印刷するコードを持っています。これは、この部分です:逆のツリーレベルを印刷

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

は、私は入力文字列の非圧縮のビットのために計算するためにそれを使用valHold変数を気にしないでください。

のは、私がリスト numArrの要素(要素がカウンターから来ていると2を分離するために letter_ar rとnumArrに転送)として 1,1,1,2,3,4があるとしましょう。

私はこのようにそれを印刷することができます。

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))