在 Python 中打印树数据结构
Posted
技术标签:
【中文标题】在 Python 中打印树数据结构【英文标题】:Printing a Tree data structure in Python 【发布时间】:2013-11-27 12:25:49 【问题描述】:我正在寻找一种可能的树打印实现,它以用户友好的方式打印树,而不是作为对象的实例。
我在网上遇到了这个解决方案:
来源:http://cbio.ufs.ac.za/live_docs/nbn_tut/trees.html
class node(object):
def __init__(self, value, children = []):
self.value = value
self.children = children
def __repr__(self, level=0):
ret = "\t"*level+repr(self.value)+"\n"
for child in self.children:
ret += child.__repr__(level+1)
return ret
此代码以下列方式打印树:
'grandmother'
'daughter'
'granddaughter'
'grandson'
'son'
'granddaughter'
'grandson'
是否可以在不改变__repr__
方法的情况下获得相同的结果,因为我将它用于其他目的。
编辑:
不修改__repr__
和__str__
的解决方案
def other_name(self, level=0):
print '\t' * level + repr(self.value)
for child in self.children:
child.other_name(level+1)
【问题讨论】:
【参考方案1】:是的,将__repr__
代码移动到__str__
,然后在您的树上调用str()
或将其传递给print
语句。记得在递归调用中也使用__str__
:
class node(object):
def __init__(self, value, children = []):
self.value = value
self.children = children
def __str__(self, level=0):
ret = "\t"*level+repr(self.value)+"\n"
for child in self.children:
ret += child.__str__(level+1)
return ret
def __repr__(self):
return '<tree node representation>'
演示:
>>> root = node('grandmother')
>>> root.children = [node('daughter'), node('son')]
>>> root.children[0].children = [node('granddaughter'), node('grandson')]
>>> root.children[1].children = [node('granddaughter'), node('grandson')]
>>> root
<tree node representation>
>>> str(root)
"'grandmother'\n\t'daughter'\n\t\t'granddaughter'\n\t\t'grandson'\n\t'son'\n\t\t'granddaughter'\n\t\t'grandson'\n"
>>> print root
'grandmother'
'daughter'
'granddaughter'
'grandson'
'son'
'granddaughter'
'grandson'
【讨论】:
@WolfgangKuehne:当然,使用不同的函数名称(在两个地方重命名),并使用print '\t' * level + repr(self.value)
而不是构建ret
值。这是 101 递归。【参考方案2】:
您为什么不将其存储为 treelib object 并将其打印出来,类似于我们打印 CHAID 树的方式 here 以及与您的用例相关的更多相关节点描述?
([], 0: 809, 1: 500, (sex, p=1.47145310169e-81, chi=365.886947811, groups=[['female'], ['male']]))
├── (['female'], 0: 127, 1: 339, (embarked, p=9.17624191599e-07, chi=24.0936494474, groups=[['C', '<missing>'], ['Q', 'S']]))
│ ├── (['C', '<missing>'], 0: 11, 1: 104, <Invalid Chaid Split>)
│ └── (['Q', 'S'], 0: 116, 1: 235, <Invalid Chaid Split>)
└── (['male'], 0: 682, 1: 161, (embarked, p=5.017855245e-05, chi=16.4413525404, groups=[['C'], ['Q', 'S']]))
├── (['C'], 0: 109, 1: 48, <Invalid Chaid Split>)
└── (['Q', 'S'], 0: 573, 1: 113, <Invalid Chaid Split>)
【讨论】:
以上是关于在 Python 中打印树数据结构的主要内容,如果未能解决你的问题,请参考以下文章
python中用字典写出树形数据结构并在控制台中打印树形数据结构
剑指offer(C++)-JZ78:把二叉树打印成多行(数据结构-树)