反向打印树级别
Printing tree levels in reverse
我有一个代码可以打印霍夫曼树。是这部分:
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
的元素(元素来自 Counter 并转移到 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
列表的元素不是预定义的。它基于用户在程序中输入的内容。
当然可以:
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
您可以按如下所示以树格式输出数据:
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]
可用于逆序读取数组。所以这里的想法是读取每一行并将每个元素转换为字符串。然后使用逗号连接它们以创建数字列表。最后,每一行都会根据最长条目的长度居中显示。
为了倒序打印,可以先放在一个列表里,再倒过来。
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))
我有一个代码可以打印霍夫曼树。是这部分:
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
的元素(元素来自 Counter 并转移到 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
列表的元素不是预定义的。它基于用户在程序中输入的内容。
当然可以:
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
您可以按如下所示以树格式输出数据:
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]
可用于逆序读取数组。所以这里的想法是读取每一行并将每个元素转换为字符串。然后使用逗号连接它们以创建数字列表。最后,每一行都会根据最长条目的长度居中显示。
为了倒序打印,可以先放在一个列表里,再倒过来。
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))