【发布时间】:2016-10-16 16:27:08
【问题描述】:
我在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]?似乎问题出在<strong>iter</strong>和next的实现中,但我不明白如何修复解决方案。
提前谢谢你。
【问题讨论】:
-
item for item in self 只会返回 self。迭代需要跟随 self.parent 直到它是 None ,它只发生在根节点 - 你可能需要一个 yield 来做到这一点。此外,init 定义中的 parent 和 value 的默认值必须使用 None 而不是 0 作为默认值。此外,您不是在构建树,这是由父项链接的项目列表。为了正确实现树,每个节点不应该包含 child1/child2(或左/右)实例变量,以便结构可以从根导航到它吗?
-
致@barny:我完全同意您关于
None作为主要父母的看法。这棵树也应该包含孩子,但在我的情况下可能有很多孩子。正如我所写的,由于迭代器的问题,此功能尚未实现。最后,遍历 self.parent 是一个好主意,尽管我无法很好地实现它。如果next返回self.parent(即使是self = self.parent),sum可以预见地陷入无休止的循环。如果你想用yield展示一个实现。这可能会有很大帮助。
标签: python python-2.7