如何根据依赖关系进行排序?

时间:2009-06-04 18:31:25

标签: python sorting dependencies

我有一个类,它有一个“依赖项”列表,指向同一基类型的其他类。

class Foo(Base):
    dependencies = []

class Bar(Base):
    dependencies = [Foo]

class Baz(Base):
    dependencies = [Bar]

我想根据它们的依赖关系对这些类生成的实例进行排序。在我的例子中,我希望Foo的实例首先出现,然后是Bar,然后是Baz。

对此进行排序的最佳方式是什么?

2 个答案:

答案 0 :(得分:18)

它被称为拓扑排序。

def sort_deps(objs):
    queue = [objs with no dependencies]
    while queue:
        obj = queue.pop()
        yield obj
        for obj in objs:
            if dependencies are now satisfied:
                queue.append(obj)
    if not all dependencies are satisfied:
        error
    return result

答案 1 :(得分:5)

上周我有一个类似的问题 - 希望我知道Stack Overflow然后!我一直在寻找,直到我意识到我有一个 DAG (定向非循环图表,因为我的依赖关系不能递归或循环)。然后我找到了几个算法的引用来对它们进行排序。我使用深度优先遍历来获取叶节点并首先将它们添加到排序列表中。

这是我觉得有用的页面:

Directed Acyclic Graphs