实现拓扑排序算法。

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埃里克·史密斯

  • 初次发布

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java动态地将圆添加到Arraylist   什么是好的“错误检查”模式(Java)?   java是我们可以在应用程序中使用的云服务,它需要存储最大大小为5MB的小文件   JavaGooglePhotosAPI是静态内容上传项目的永久url   java AES密钥存储   java文件正在下载,但没有任何内容   每次循环迭代和threadsleep的java日志记录都是不好的做法?   java不会切换到另一个。单击submit时使用jsp。春季mvc   java我很难从我的maclaurin系列中获得sin x的准确输出   java使用类似的<Object>?   需要java Hibernate映射吗?   java如何在https和客户端证书请求后面生成web服务代理   java如何通过注释有条件地使用自定义JsonSerializer   java如何在html页面和Restful WebResource方法之间实现JaxB?   读取文件Libgdx Android时发生java错误   java如何在处理主活动之前从另一个方法中获取值?   java在一个SQLquery中使用多个语句,还是使用批处理?