Python 拓扑排序,递归,使用生成器

Python 拓扑排序,递归,使用生成器,python,recursion,generator,topology,Python,Recursion,Generator,Topology,数据:已验证为非循环的依赖项列表。所以这里,'a'依赖于'b','c'(c依赖于d),等等 A = { 'a' : dict(b=1, c=1), 'c' : dict(d=1), 'd' : dict(e=1,f=1,g=1), 'h' : dict(j=1) } 我想要一个自上而下的递归解决方案,比如说,找到从 “a”:a、c、d、e、g、f、b 因此,现在(非发电机解决方案): 很明显,这是非常脆弱的:)我一直在绞尽脑汁想如何在那里获得收益,我很感激你们

数据:已验证为非循环的依赖项列表。所以这里,'a'依赖于'b','c'(c依赖于d),等等

A = { 'a' :  dict(b=1, c=1),
    'c' : dict(d=1),
    'd' : dict(e=1,f=1,g=1),
    'h' : dict(j=1)
    }
我想要一个自上而下的递归解决方案,比如说,找到从 “a”:a、c、d、e、g、f、b

因此,现在(非发电机解决方案):

很明显,这是非常脆弱的:)我一直在绞尽脑汁想如何在那里获得收益,我很感激你们所有人能带来的任何好处。

试试这个:

#!/usr/bin/env python

def get_all(D, k):
    yield k
    for ii in D.get(k, []):
        for jj in get_all(D, ii):
            yield jj

A = { 'a' : dict(b=1, c=1),
    'c' : dict(d=1),
    'd' : dict(e=1,f=1,g=1),
    'h' : dict(j=1)
    }

for ii in get_all(A,'a'):
    print ii
给我

steve@rei:~/code/tmp $ python recur.py a c d e g f b steve@rei:~/code/tmp $python recur.py A. C D E G F B
两个答案给出了相同的结果,但如果我对问题的理解是正确的,则对给定图形的简单修改给出错误的答案-如果您从“b”中添加对“c”的依赖项(在图形指向时不会引入循环),则输出为:

A.
C
D
E
G
F
B
D
E
G
F

这并不完全有帮助。试试这个小的变化,它跟踪图中哪些节点已经被访问过:

def get_all(D, k, seen=None):
    if not seen:
        seen = set( )
    if k not in seen:
        seen.add(k)
        yield k
        for ii in D.get(k, []):
            for jj in get_all(D, ii, seen):
                yield jj

没问题:-)也许是因为我今天喝了太多咖啡:PDid有人说咖啡!?:)回答得好,freespace。我相信这在多个节点指向同一个节点的情况下是行不通的。{'a':dict(b=1),'c':dict(b=1)}它怎么会不工作呢?根据您提供的数据,我的算法为从a开始的链生成b,这在我看来是正确的。因此,此方法的问题是存储长度可能再次膨胀到N,其中N是图中的节点数。不过,这是一个非常有用的变体。对于这个特殊的应用程序,我不介意重新访问链。
def get_all(D, k, seen=None):
    if not seen:
        seen = set( )
    if k not in seen:
        seen.add(k)
        yield k
        for ii in D.get(k, []):
            for jj in get_all(D, ii, seen):
                yield jj