2011-08-20 101 views
5

我想要生成树中每个叶到根的所有路径。我想用发电机来做到这一点,以节省内存(树可以很大)。这是我的代码:Python(yield):树中从叶到根的所有路径

def paths(self, acc=[]): 
    if self.is_leaf(): 
     yield [self.node]+acc 

    for child in self.children: 
     child.paths([self.node]+acc) 

但它不起作用。为什么?在根中调用时,它从上到下遍历树,收集“acc”中的节点。 “acc”应该在每一片叶子中返回...

如果self.children为空,则is_leaf()为true。

回答

7

这个代码仅产生叶子是根(立即)的儿童。其他人得到访问,他们屈服于上层功能,但上层功能与他们没有任何关系。你需要的是让他们从低级功能到高级功能:

def paths(self, acc=[]): 
    if self.is_leaf(): 
     yield [self.node]+acc 

    for child in self.children: 
     for leaf_path in child.paths([self.node]+acc): # these two 
      yield leaf_path       # lines do that 

这应该可以做到。

+0

我一直在想 - 有没有一个快速的“全部产生”命令,或者是最短的'for'循环你写的? – Owen

+0

@Own nope,但我发现它可以这样,它只是两条简单的线...... –

+5

在Python 3.3中,会有一个'yield from'语句,它会自动从另一个生成器中产生项目,所以任何'for'循环有一个“yield”,你可以写成一个生成器表达式,可以制作成一行。 – agf

1

目前for循环没有yield什么。应该不是产生所有由递归调用产生的元素:

for child in self.children: 
    for path in child.paths([self.node]+acc): 
     yield path 
相关问题