如何对 python 中的列表进行拓扑排序

how to do topological sort with lists in python

我刚开始写我的学士论文,我想做的是创建一个算法,根据过去的学习成绩提供关于课程选择的个性化建议。我正在学习和使用 python,到目前为止,我已经创建了一个课程列表和一个先决条件列表,如下所示:

[['CS101'], ['CS105'], ['CS106', 'CS105'], ['CS107'], ['CS130'], ['CS151', 'CS105', 'MATH101'], ['CS180'], ['CS201', 'CS151'], ['CS205', 'CS105'], ...]

因此,例如,要学习 CS101,您不需要学习任何其他课程,但要学习 CS106,您必须已经学习了 CS105。现在,我必须进行拓扑排序,即使我从 Stack Overflow 中提供的类似问题中找到了一些代码,它也不起作用。解决方案是这样的(为了适用于我的代码,我只修改了 my_lists 的部分):

        import networkx as nx

        my_lists = data.prerequisites
        my_graph = nx.DiGraph()
        for path in my_lists:
            my_graph.add_nodes_from(path)
            my_graph.add_path(path)

        ts = nx.topological_sort(my_graph)
        print(ts)

其中 data.prerequisites 是在另一个 python 文件 (data.py) 中创建的列表。问题是,当我 运行 这给了我这个错误:

AttributeError: 'DiGraph' object has no attribute 'add_path'

我搜索了 networkx 2.4 的文档,但没有任何内容表明它们用什么替换了 add_path()。这个错误有一个解决方案,但它不再有效,因为该解决方案是在 2011 年给出的,并且 add_path() 在 2019 年被完全删除。我尝试使用互联网上的其他示例,但我找不到合适的一个用于列表。我应该尝试找到一种完全不同的方法还是有一个像这样的简单的小解决方案?因为很多我都看不懂。

参见add_path的文档调用方法的新方法是

nx.add_path(my_graph, path)

作为附加提示,您不需要调用 my_graph.add_nodes_from(path),因为节点是与边一起添加的。