层次结构中的树构建器和打印节点
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():
有没有更好的方法是打印一棵树?我正在做以下事情。我正在使用以下代码构建一棵树。我到底犯了什么错误?它给出了以下错误
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-inset()
type。
方法本身,只要您实际循环遍历 treenode
objects 的集合,就可以正常工作。您可以遍历字典的值,也许:
for child in self.children.values():