Python 将数组打印为树
我有一个数组(树),如: 我想把它打印成一棵树。这是我的尝试Python 将数组打印为树,python,arrays,tree,pretty-print,Python,Arrays,Tree,Pretty Print,我有一个数组(树),如: 我想把它打印成一棵树。这是我的尝试 def printTree(treeToPrint, tab): print tab + treeToPrint[0] newTab = tab + "--" nextTree = treeToPrint[1:] for tree in nextTree: print newTab + tree[0] printTree(tree[1], newTab + "--")
def printTree(treeToPrint, tab):
print tab + treeToPrint[0]
newTab = tab + "--"
nextTree = treeToPrint[1:]
for tree in nextTree:
print newTab + tree[0]
printTree(tree[1], newTab + "--")
它打印输出如下:
Humidity
--High
----Outlook
------Sunny
--------Temp
----------Hot
------------Wind
--------------Weak
----------------No
--------------Strong
----------------No
----------Mild
------------No
------Overcast
--------Temp
----------Hot
------------Yes
----------Mild
------------Yes
------Rain
--------Temp
----------Mild
------------Wind
--------------Weak
----------------Yes
--------------Strong
----------------No
--Normal
----Wind
------Weak
--------Outlook
----------Rain
------------Yes
----------Overcast
------------Temp
--------------Cool
----------------Yes
--------------Hot
----------------Yes
----------Sunny
------------Yes
------Strong
--------Temp
----------Cool
------------No
----------Mild
------------Outlook
--------------Rain
----------------Yes
--------------Sunny
----------------Yes
有人能帮我用一种漂亮的格式表示这棵树吗。有时候,
pprint
做得很好:
>>> from pprint import pprint
>>> pprint(x)
['Humidity\n',
['High',
['Outlook\n',
['Sunny',
['Temp\n',
['Hot', ['Wind\n', ['Weak', ['No']], ['Strong', ['No']]]],
['Mild', ['No']]]],
...
有时,
pprint
做得很好:
>>> from pprint import pprint
>>> pprint(x)
['Humidity\n',
['High',
['Outlook\n',
['Sunny',
['Temp\n',
['Hot', ['Wind\n', ['Weak', ['No']], ['Strong', ['No']]]],
['Mild', ['No']]]],
...
您可以使用以下代码示例: 此代码使用python
TkInter
包在一个单独的窗口中绘制树。
您可以通过以下命令在linux中安装TkInter:sudo apt get install python tk
如果您想生产类似的产品,可以使用此选项:
正如你在评论中提出的那样。但这不能用于控制台中的打印。您可以使用以下代码示例: 此代码使用python
TkInter
包在一个单独的窗口中绘制树。
您可以通过以下命令在linux中安装TkInter:sudo apt get install python tk
如果您想生产类似的产品,可以使用此选项:
正如你在评论中提出的那样。但这不能用于控制台中的打印。这与此类似:
from collections import deque
class BTreeNode:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
def insertNode(self, node):
if node.data < self.data:
if self.left == None:
self.left = node
else:
self.left.insertNode(node)
else:
if self.right == None:
self.right = node
else:
self.right.insertNode(node)
def printLevel(self):
""" Breadth-first traversal, print out the data by level """
level = 0
lastPrintedLevel = 0
visit = deque([])
visit.append((self, level))
while len(visit) != 0:
item = visit.popleft()
if item[1] != lastPrintedLevel: #New line for a new level
lastPrintedLevel +=1
print
print item[0].data,
if item[0].left != None:
visit.append((item[0].left, item[1] + 1))
if item[0].right != None:
visit.append((item[0].right, item[1] + 1))
bt=BTreeNode(1,left=BTreeNode(2,left=BTreeNode(4)),
right=BTreeNode(3,left=BTreeNode(5),right=BTreeNode(6)))
bt.printLevel()
另一个备选方案:
import math
from cStringIO import StringIO
def show_tree(tree, total_width=33, fill=' '):
"""Pretty-print a tree."""
output = StringIO()
last_row = -1
for i, n in enumerate(tree):
if i:
row = int(math.floor(math.log(i+1, 2)))
else:
row = 0
if row != last_row:
output.write('\n')
columns = 2**row
col_width = int(math.floor((total_width * 1.0) / columns))
output.write(str(n).center(col_width, fill))
last_row = row
print output.getvalue()
print '-' * total_width
print
return
show_tree(range(15))
印刷品:
0
1 2
3 4 5 6
7 8 9 10 11 12 13 14
---------------------------------
现在,只需确定数据的根是什么,然后递归地附加到一个BTree,您就在那里了。这与此类似:
from collections import deque
class BTreeNode:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
def insertNode(self, node):
if node.data < self.data:
if self.left == None:
self.left = node
else:
self.left.insertNode(node)
else:
if self.right == None:
self.right = node
else:
self.right.insertNode(node)
def printLevel(self):
""" Breadth-first traversal, print out the data by level """
level = 0
lastPrintedLevel = 0
visit = deque([])
visit.append((self, level))
while len(visit) != 0:
item = visit.popleft()
if item[1] != lastPrintedLevel: #New line for a new level
lastPrintedLevel +=1
print
print item[0].data,
if item[0].left != None:
visit.append((item[0].left, item[1] + 1))
if item[0].right != None:
visit.append((item[0].right, item[1] + 1))
bt=BTreeNode(1,left=BTreeNode(2,left=BTreeNode(4)),
right=BTreeNode(3,left=BTreeNode(5),right=BTreeNode(6)))
bt.printLevel()
另一个备选方案:
import math
from cStringIO import StringIO
def show_tree(tree, total_width=33, fill=' '):
"""Pretty-print a tree."""
output = StringIO()
last_row = -1
for i, n in enumerate(tree):
if i:
row = int(math.floor(math.log(i+1, 2)))
else:
row = 0
if row != last_row:
output.write('\n')
columns = 2**row
col_width = int(math.floor((total_width * 1.0) / columns))
output.write(str(n).center(col_width, fill))
last_row = row
print output.getvalue()
print '-' * total_width
print
return
show_tree(range(15))
印刷品:
0
1 2
3 4 5 6
7 8 9 10 11 12 13 14
---------------------------------
现在,只要确定数据的根是什么,然后递归地附加到一个B树上,你就可以了。请定义“漂亮的格式”…看看他们是如何在这里打印树的:树可能有点像你想用漂亮的格式,我的意思是,像这样:请定义“漂亮的格式”…看看他们是如何在这里打印树的:树可能有点像你想用漂亮的格式,我的意思是,比如:嘿,非常感谢,但是你能用这种格式得到这棵树吗?我是说,任何地方都可以。嘿,非常感谢,但是你能用这种格式得到这棵树吗?我是说,任何地方都可以