Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何遍历树中的实例?_Python_Python 2.7 - Fatal编程技术网

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

我对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的实施过程中,但我不知道如何修复解决方案

提前谢谢你。

给你:

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
可预见地陷入了一个无休止的循环。如果您想用
显示一个实现,就要产生
。这可能会有很大帮助。每次迭代类的实例时,您都在构建一个列表。这可能是不可取的,因为每次遍历类的实例时,父类的数量都在增加,而您正在构建一个列表。随着父母数量的增长,这可能并不理想