python - 从本地排序中查找全局排序

标签 python graph-theory

假设您有一个元组列表

[(a,d), (a,c), (b,c), (a,b), (c,d)]

元组的第二个元素大于第一个元素

假设只有一个有序列表(包含至少一个元组中出现的所有元素)与所有元组一致。在本例中为列表

[a,b,c,d]

我们如何找到该列表?

最佳答案

在最简单的情况下,您的对象是定义了方法 __eq____hash____lt__ 的类的实例。前两种方法允许您使用set,而第三种方法允许您使用sorted。这是一个示例(lst 是您的初始元组列表):

sorted_elements = sorted({el for t in lst for el in t})

您可以将之前的解决方案与数字和字符一起使用(这只是一个示例):

>>> lst = [(3,4), (7,8), (7,9), (1,3)]
>>> sorted_elements = sorted({el for t in lst for el in t})
>>> sorted_elements
[1, 3, 4, 7, 8, 9]
>>> lst = [('a','b'), ('c','e'), ('c','z')]
>>> sorted_elements = sorted({el for t in lst for el in t})
>>> sorted_elements
['a', 'b', 'c', 'e', 'z']

在更一般的情况下,您可能希望使用拓扑排序(例如,通过使用 networkx 包)。在本例中,您的对象属于 A 类型:

import networkx as nx

G = nx.DiGraph()
G.add_edges_from(lst)

sorted_elements = list(nx.topological_sort(G))

这是一个例子:

import networkx as nx

class A:
    def __init__(self, name):
        self.name = name

a, b, c, d = A('a'), A('b'), A('c'), A('d')
lst = [(a,d), (a,c), (b,c), (a,b), (c,d)]

G = nx.DiGraph()
G.add_edges_from(lst)

sorted_elements = list(nx.topological_sort(G))

print([el.name for el in sorted_elements]) # ['a', 'b', 'c', 'd']

关于python - 从本地排序中查找全局排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71118506/

相关文章:

python - 如何使用 Python 绑定(bind)在 Selenium webdriver 中加载 HtmlUnit 驱动程序?

python - 使用关系运算符的 SPARQL 查询

python - 无法登录到 uwsgi 控制台

rust - Rust中的异构容器的图形

algorithm - 点加速的最快路径

algorithm - 查找图中访问某些节点的最短路径

Python re.groups 不显示所有子组

python - 对于输入 =4,if ( Selection < 0) 和 (Selection > 3) 条件的行为不同。为什么?

algorithm - 是否存在仅通过每种颜色一次的路径?

algorithm - 寻找最小瓶颈路径的线性时间算法