Tengo un código donde imprime el Árbol Huffman. Es esta parte:

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

No importa las variables valHold. Lo uso para calcular los bits sin comprimir de la cadena de entrada.

Digamos que tengo 1,1,1,2,3,4 como elementos de la lista numArr (los elementos provienen de un Contador y se transfieren a letter_ar r y numArr para separar los dos).

Solo puedo imprimirlo así:

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

¿Hay alguna manera de imprimirlo de la otra manera? ¿Cómo se verá más como un árbol? Me gusta esto:

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

Será mucho mejor si me puede enseñar cómo imprimirlo con sangría:

     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

Tenga en cuenta que los elementos de la lista numArr no están predefinidos. Se basa en lo que el usuario ingresa en el programa.

0
Paradigm 9 may. 2016 a las 09:14

3 respuestas

La mejor respuesta

Seguro:

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
John Zwinck 9 may. 2016 a las 06:29

Para imprimir en orden inverso, puede ponerlo en una lista primero y luego invertirlo.

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

Para sangrar el resultado y alinearlo con cada número puede necesitar un poco de trabajo extra, pero puede intentar centrar el resultado como una solución alternativa. Primero convierta cada lista en una cadena y calcule el ancho máximo. Luego use str.center para centrar el texto.

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))
0
Colin Yang 9 may. 2016 a las 06:54

Puede generar sus datos en un formato de árbol de la siguiente manera:

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

Esto mostraría:

      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] se puede usar para leer una matriz en orden inverso. Entonces, la idea aquí es leer cada fila y convertir cada elemento en una cadena. Luego se unen mediante comas para crear una lista de números. Finalmente, cada fila se muestra centrada en función de la longitud de la entrada más larga.

0
Martin Evans 9 may. 2016 a las 06:32