【问题标题】:How to sort a list of inter-linked tuples?如何对相互链接的元组列表进行排序?
【发布时间】:2021-12-27 18:56:20
【问题描述】:
lst = [(u'course', u'session'), (u'instructor', u'session'), (u'session', u'trainee'), (u'person', u'trainee'), (u'person', u'instructor'), (u'course', u'instructor')]

我有上面的元组列表,我需要按照以下逻辑对其进行排序...... 每个元组的第二个元素取决于第一个元素,例如(course, session) -> session 取决于 course 等等..

我想要一个基于它们依赖的优先级的排序列表,较少或独立的对象将首先出现,所以输出应该如下所示,

lst = [course, person, instructor, session, trainee]

【问题讨论】:

    标签: python list sorting tuples topological-sort


    【解决方案1】:

    从概念上讲,您需要做的是创建一个directed acyclic graph,其边由列表的内容确定,然后在图表上创建一个topological sort。 Python 的标准库中不存在执行此操作的算法(至少,不是我能想到的),但您可以在网上找到大量第三方实现,例如 http://www.bitformation.com/art/python_toposort.html

    该网站上的函数获取所有字符串的列表items,以及字符串之间的另一个对列表partial_order。您的 lst 应该作为第二个参数传递。要生成第一个参数,您可以使用itertools.chain.from_iterable(lst),因此整个函数调用将是

    import itertools
    lst = ...
    ordering = topological_sort(itertools.chain.from_iterable(lst), lst)
    

    或者您可以修改网站上的函数以仅接受一个参数,并直接根据您的 lst 中的值在图中创建节点。

    编辑:使用 Alex Martelli 链接的 topsort 模块,您可以直接传递 lst

    【讨论】:

      【解决方案2】:

      您正在寻找所谓的topological sort。维基百科页面展示了经典的卡恩和深度优先搜索算法; Python 示例是here(有点过时,但应该仍然可以正常运行),pypi(稳定且可重用——您也可以在线阅读代码here)和here(Tarjan 的算法,那种- of 还处理指定依赖项中的循环),仅举几例。

      【讨论】:

        猜你喜欢
        • 2021-08-05
        • 1970-01-01
        • 1970-01-01
        • 2014-07-22
        • 1970-01-01
        • 1970-01-01
        • 2020-07-20
        • 2015-02-28
        相关资源
        最近更新 更多