实现拓扑排序算法。
toposort的Python项目详细描述
概述
实现拓扑排序算法。
>;来自Wikipedia: 在计算机科学中,一种拓扑排序(有时简称tosport 或拓扑排序)或有向图的拓扑排序是线性的 其顶点的顺序,使得对于每个有向边 顶点u到顶点v,u的顺序在v之前。
输入数据描述
toposort函数的输入是描述 输入节点之间的依赖关系。每个键都是一个依赖节点, 对应的值是包含依赖节点的集合。
注意toposort并不关心输入节点值的含义:它 只是比较一下他们是否平等。这里的例子通常使用 整数,但它们可以是任何哈希类型。
典型用法
这里输入数据的解释是:如果2依赖于11;9 取决于11、8和10;10取决于11和3(等等),那么 我们是否应该处理这些项以便处理所有节点 在他们的依赖之前?:
>>> from toposort import toposort, toposort_flatten >>> list(toposort({2: {11}, ... 9: {11, 8, 10}, ... 10: {11, 3}, ... 11: {7, 5}, ... 8: {7, 3}, ... })) [{3, 5, 7}, {8, 11}, {2, 10}, {9}]
答案是:进程3、5和7(按任意顺序);然后是进程8 和11;然后处理2和10;然后处理9。注意3、5和7 因为它们不依赖任何东西,所以先返回。他们是 然后从考虑中移除,然后8和11不依赖于 任何剩余的东西。此过程将继续,直到所有节点 返回,或检测到循环依赖项。
循环依赖项
循环依赖项将引发cyclicDependencYerror,即 从ValueError派生这里1依赖于2,2依赖于1:
>>> list(toposort({1: {2}, ... 2: {1}, ... })) Traceback (most recent call last): ... toposort.CircularDependencyError: Circular dependencies exist among these items: {1:{2}, 2:{1}}
此外,引发的cyclicdependencyerror的“data”属性 将包含包含所涉及的输入数据子集的dict 在循环依赖关系中。
模块内容
toposort(data)
返回一个迭代器,该迭代器描述 输入数据。每个返回的项都是一个集合。这组的每个成员 在此集合或以前返回的任何集合中没有依赖项。
toposort_flatten(data, sort=True)
类似于toposort(data),只是它返回 按顺序依赖值。如果sort为true,则返回的节点在 每个组在附加到结果之前:
>>> toposort_flatten({2: {11}, ... 9: {11, 8, 10}, ... 10: {11, 3}, ... 11: {7, 5}, ... 8: {7, 3}, ... }) [3, 5, 7, 8, 11, 2, 10, 9]
注意,这个结果与第一个示例相同:[{3, 5, 7}, {8, 11}, {2, 10}, {9}], 但是结果是平展的,并且在每个集合中都有节点 已经分类了。
测试
要测试,请运行“python setup.py test”在python>;=3.0上,它还运行doctests。
更改日志
1.5 2016年10月24日Eric V.Smith
- 当检测到循环依赖性错误时,引发 异常,CircularDependencyError,它是 值错误。异常的“data”属性将包含 循环依赖关系中涉及的数据(问题2)。谢谢 初始补丁的lilydjwg。
- 为了使构建控制盘更容易,始终需要在 setup.py(第5期)。
- 将wheel标记为通用的,即同时支持python 2.7 和3.x(第7期)。
1.4 2015-05-16埃里克V.史密斯
- 删除了“test”包,因此bdist不会安装它。它还是 包括在SDists中。
- 没有代码更改。
1.3 2015年5月15日Eric V.Smith
- 固定更改日志日期。
- 没有代码更改。
1.2 2015年5月15日Eric V.Smith
- 如果与python3一起运行,则将rpm名称更改为python3 toposort。
- 没有代码更改。
1.1 2014-07-24埃里克诉史密斯
- 发布版本1.1。没有代码更改。
- 在运行测试套件时添加readme.txt条目。
- 修复sdist中缺少的test/\uu init\uu.py。
1.0 2014年3月14日Eric V.Smith
- 发布版本1.0。API是稳定的
- 将manifest.in添加到manifest.in,以便在sdist中创建它 (第1期)
0.2 2014-02-11埃里克·史密斯
- 修改setup.py以生成用于bdist_RPM的python toposort的RPM名称
0.1 2014-02-10埃里克·史密斯
- 初次发布