我在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.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
的实现中,但我无法理解如何修复解决方案。
提前谢谢。
答案 0 :(得分:0)
你走了:
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
值更改为无。
for i in child2:
print(i)
10
8
0 # 0 is here because the parent value is 0 by default.
答案 1 :(得分:0)
我不确定你可以称之为Tree
。人们会期望父节点和多个叶子节点,而不仅仅是对象的线性连接。
请参阅:A general tree implementation?
另外请注意,如果您要实施链接列表,则应考虑Barny对您的问题的评论中提出的建议,您也可以关注:Python Linked List
来到你当前的实现,你需要某种循环,从当前子节点一直走到头父节点。如果未找到下一个父属性,请停止迭代。以下将逻辑放在类的__iter__
方法中,该方法现在是生成函数:
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_)
演示:
parent = Tree()
child = Tree(parent=parent, value=8)
child2 = Tree(parent=child,value=10)
child3 = Tree(parent=child2,value=4)
print child3.sum_from_node()
# [4, 10, 8, 0]
# 22