【问题标题】:Printing a Tree data structure in Python在 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)

【问题讨论】:

    标签: python python-2.7 printing tree


    【解决方案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>)
    

    【讨论】:

      猜你喜欢
      • 2022-09-27
      • 1970-01-01
      • 2021-08-18
      • 2012-06-07
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 2016-09-07
      • 2012-10-17
      相关资源
      最近更新 更多