我有一个类,它有一个指向其他相同基础类型的类的“依赖项”列表。
class Foo(Base):
dependencies = []
class Bar(Base):
dependencies = [Foo]
class Baz(Base):
dependencies = [Bar]
我想根据它们的依赖关系对这些类生成的实例进行排序。在我的示例中,我希望Foo的实例首先出现,然后是Bar,最后是Baz。
有什么最好的方法可以排序吗?
我有一个类,它有一个指向其他相同基础类型的类的“依赖项”列表。
class Foo(Base):
dependencies = []
class Bar(Base):
dependencies = [Foo]
class Baz(Base):
dependencies = [Bar]
这被称为拓扑排序。
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
我上周也有一个类似的问题,但很遗憾当时不知道Stack Overflow!我搜索了一下,直到我意识到我有一个DAG(有向无环图),因为我的依赖关系不能是递归或循环的。然后我找到了一些算法参考来对它们进行排序。我使用深度优先遍历来访问叶节点并将它们添加到排序列表中。
这里是我发现有用的页面: