层次结构中的树构建器和打印节点

Tree builder and printing nodes in a hierarchy

有没有更好的方法是打印一棵树?我正在做以下事情。我正在使用以下代码构建一棵树。我到底犯了什么错误?它给出了以下错误

      63         ret = "\t"*level+repr(self.label)+"\n"          
      64         for child in self.children:     
 ---> 65             ret += child.__str__(level+1)          
      66         return ret          
      67 

TypeError: expected 0 arguments, got 1 

下面附上代码

from collections import Counter
from sets import Set

class treenode:
    def __init__(self, values):
        self.label = values
        self.children = {}

    def __str__(self, level=0):
        ret = "\t"*level+repr(self.label)+"\n"
        for child in self.children:
            ret += child.__str__(level+1)
        return ret

    def __repr__(self):
        return '<tree node representation>'

def build_tree(featurerange, featureid, counts):
    if len(sorted(counts)) > 1:
        featuresLeft = featurerange - Set([featureid])
        if not featuresLeft:
            rootnode.children[v] = treenode(counts.most_common(1)[0][0])
        else:
            rootnode.children[v] = build_tree(featuresLeft)
    else:
        rootnode.children[v] = treenode(counts.most_common(1)[0][0])

    return rootnode

featurerange = set([0, 1])
featureid = 1
counts = Counter({'-': 49, '+': 45})  

tree = build_tree(featurerange, featureid, counts)
str(tree)
print tree

您正在将 children 设置为默认为空字典:

def __init__(self, values, children = {}):

实例之间共享。然后,您继续 一遍又一遍地替换 相同的密钥:

rootnode.children[v] = treenode(counts.most_common(1)[0][0])

其中 v 是全局的;你没有在你的问题中分享它,所以我不知道那是什么object。

循环 self.children 然后循环字典的 keys:

for child in self.children:

child 而不是 一个 treenode 实例,所以 __str__ 方法不需要额外的参数。相反,它是一个 v 值,但它显然没有实现采用额外参数的 object.__str__ 方法。

也许您想制作 children 列表?无论如何,您的代码中有几个问题需要解决:

  • 您在这里使用了一个可变的默认参数,您正在创建 一个 字典并且您的所有实例都共享它。请参阅 "Least Astonishment" and the Mutable Default Argument 了解为什么要避免这种情况。使用:

    def __init__(self, values, children=None):
        if children is None:
            children = {}
    
  • 您似乎在 build_tree() 中使用 v 全局;您真的需要使用字典和字典中的 one 键吗? children 不应该是序列或集合吗?如果是这样,请使用 list.append()set.add() 增加 children.

  • 的集合
  • 您似乎在使用 deprecated sets.Set() object; use the built-in set() type

方法本身,只要您实际循环遍历 treenode objects 的集合,就可以正常工作。您可以遍历字典的值,也许:

for child in self.children.values():