Python 如何遍历树中的实例?
我对python中自行编写的树类有一个问题:Python 如何遍历树中的实例?,python,python-2.7,Python,Python 2.7,我对python中自行编写的树类有一个问题: class Tree: def __init__(self, parent=0, value=0): self.value = value self.parent = parent def __iter__(self): return self def next(self): tmp = self.value try: self.paren
class Tree:
def __init__(self, parent=0, value=0):
self.value = value
self.parent = parent
def __iter__(self): return self
def next(self):
tmp = self.value
try:
self.parent = self.parent.parent
self.value = self.parent.value
except AttributeError:
raise StopIteration
return tmp
def sum(self):
list_ = [item for item in self]
print list_
return sum(list_)
实际上,“树”还没有完全写出来,但当前的问题阻碍了进一步的进展。
该结构只有两个实例变量(value
,parent
)。
我想用迭代器将当前实例的值和第一个父实例的值相加(如果可能的话)。sum
方法用于此(不需要额外的list
变量,但有助于进一步解释问题)
运行测试用例时
parent = Tree()
child = Tree(parent=parent, value=8)
child2 = Tree(parent=child,value=10)
print child2.sum()
我获得以下资料:
[10]
10
请解释一下为什么值列表只包含一个数字,尽管它看起来应该像[10,8]
?似乎问题出在iter和next的实施过程中,但我不知道如何修复解决方案
提前谢谢你。给你:
class Tree:
def __init__(self, parent=None, value=0):
self.value = value
self.parent = parent
def __iter__(self):
yield self.value
root = self
while root.parent is not None:
yield root.parent.value
root = root.parent
raise StopIteration
def tree_sum(self):
return sum(list(self))
parent = Tree()
child = Tree(parent=parent, value=8)
child2 = Tree(parent=child,value=10)
我已将默认的parent
值更改为None
for i in child2:
print(i)
10
8
0 # 0 is here because the parent value is 0 by default.
给你:
class Tree:
def __init__(self, parent=None, value=0):
self.value = value
self.parent = parent
def __iter__(self):
yield self.value
root = self
while root.parent is not None:
yield root.parent.value
root = root.parent
raise StopIteration
def tree_sum(self):
return sum(list(self))
parent = Tree()
child = Tree(parent=parent, value=8)
child2 = Tree(parent=child,value=10)
我已将默认的parent
值更改为None
for i in child2:
print(i)
10
8
0 # 0 is here because the parent value is 0 by default.
我不确定您是否可以将其称为
树
。可以预期父节点和多个叶节点,而不仅仅是对象的线性连接
见:
另一方面,如果您想要实现linkedlist,则应考虑Barny在对您的问题的评论中提出的建议,此外,您还可以关注:
在当前实现中,需要某种循环,从当前子节点一直走到头部父节点。当未找到下一个父属性时,停止迭代。下面将逻辑放在类的\uuuu iter\uuu
方法中,该方法现在是一个生成器函数:
class Tree:
def __init__(self, parent=None, value=0):
self.value = value
self.parent = parent
def __iter__(self):
_parent = self.parent
yield self.value
while True:
try:
yield _parent.value
_parent = _parent.parent
except AttributeError:
break
def sum_from_node(self):
list_ = [item for item in self]
print list_
return sum(list_)
演示:
我不确定您是否可以将其称为
树
。可以预期父节点和多个叶节点,而不仅仅是对象的线性连接
见:
另一方面,如果您想要实现linkedlist,则应考虑Barny在对您的问题的评论中提出的建议,此外,您还可以关注:
在当前实现中,需要某种循环,从当前子节点一直走到头部父节点。当未找到下一个父属性时,停止迭代。下面将逻辑放在类的\uuuu iter\uuu
方法中,该方法现在是一个生成器函数:
class Tree:
def __init__(self, parent=None, value=0):
self.value = value
self.parent = parent
def __iter__(self):
_parent = self.parent
yield self.value
while True:
try:
yield _parent.value
_parent = _parent.parent
except AttributeError:
break
def sum_from_node(self):
list_ = [item for item in self]
print list_
return sum(list_)
演示:
self中的项目对应的项目将仅返回self。迭代需要跟随self.parent,直到它不存在为止,这只发生在根节点上——您可能需要一个屈服点来完成这一点。此外,init定义中父项和值的默认值必须使用None,而不是0作为默认值。此外,您没有构建树,这是一个由父项链接的项目列表。为了正确地实现一个树,每个节点不应该包含child1/child2(或左/右)实例变量,这样结构就可以从根位置导航到根位置,也可以从根位置导航到根位置吗。树上也应该有孩子,但在我的情况下,孩子可能很多。正如我所写的,由于迭代器的问题,这个功能还没有实现。最后,遍历self.parent是一个好主意,尽管我无法以良好的方式实现它。如果
next
返回self.parent(即使使用self=self.parent
),sum
可预见地陷入了一个无休止的循环。如果您想用显示一个实现,就要产生。这可能会有很大帮助。self中的一个项目一个项目只会返回self。迭代需要跟随self.parent,直到它不存在为止,这只发生在根节点上——您可能需要一个屈服点来完成这一点。此外,init定义中父项和值的默认值必须使用None,而不是0作为默认值。此外,您没有构建树,这是一个由父项链接的项目列表。为了正确地实现一个树,每个节点不应该包含child1/child2(或左/右)实例变量,这样结构就可以从根位置导航到根位置,也可以从根位置导航到根位置吗。树上也应该有孩子,但在我的情况下,孩子可能很多。正如我所写的,由于迭代器的问题,这个功能还没有实现。最后,遍历self.parent是一个好主意,尽管我无法以良好的方式实现它。如果next
返回self.parent(即使使用self=self.parent
),sum
可预见地陷入了一个无休止的循环。如果您想用显示一个实现,就要产生。这可能会有很大帮助。每次迭代类的实例时,您都在构建一个列表。这可能是不可取的,因为每次遍历类的实例时,父类的数量都在增加,而您正在构建一个列表。随着父母数量的增长,这可能并不理想