在无向网络X图中确定边的顺序

3
在无向的NetworkX图中,边被表示为Python元组。它们的顺序取决于您询问它们的方式。以下是一个小例子,说明我所指的内容:
import networkx as nx
g = nx.complete_bipartite_graph(2,2)
print(g.edges())
print(g.edges(2))

输出结果为:
[(0, 2), (0, 3), (1, 2), (1, 3)]
[(2, 0), (2, 1)]

有没有一种方法(不需要手动排序),可以避免边缘具有不同的表示形式?
1个回答

0

我不确定你想要什么,因为在标题中你要求有序边缘,但在你的示例中你要求边缘中的节点有序。在我的示例中,我展示了两者的排序。请注意,我使用列表推导式创建新的边缘列表 -- 原始的边缘列表 (some_edges) 不会改变。

首先是如何对边缘列表中的单个节点元组进行排序。也就是说,边缘按照相同的顺序排列,但其中的节点被排序。

import networkx as nx
g = nx.Graph()
g.add_edges_from([
    (5, 2),
    (2, 1),
    (3, 2),
    (4, 2)
])
some_edges = g.edges(2)
print("Not sorted:  ", some_edges)

print("SORTED")
# sort nodes in edges
some_edges_1 = [tuple(sorted(edge)) for edge in some_edges]
print("Sorted nodes:", some_edges_1)

现在讲解如何对边列表进行排序。

# sort edges in list of edges
some_edges_2 = sorted(some_edges_1)
print("Sorted edges:", some_edges_2)

上述两个代码块的输出结果:

Not sorted:   [(2, 1), (2, 3), (2, 4), (2, 5)]
SORTED
Sorted nodes: [(1, 2), (2, 3), (2, 4), (2, 5)]
Sorted edges: [(1, 2), (2, 3), (2, 4), (2, 5)]

这里还有一个反向排序的例子,您可以看到对单个边进行排序和对边列表进行排序之间的区别。

print("Not sorted:  ", some_edges)
print("SORTED REVERSE")
# sort nodes in edges
some_edges_1 = [tuple(sorted(edge, reverse=True)) for edge in some_edges]
print("Sorted nodes:", some_edges_1)
# sort edges in list of edges
some_edges_2 = sorted(some_edges_1, reverse=True)
print("Sorted edges:", some_edges_2)

输出:

Not sorted:   [(2, 1), (2, 3), (2, 4), (2, 5)]
SORTED REVERSE
Sorted nodes: [(2, 1), (3, 2), (4, 2), (5, 2)]
Sorted edges: [(5, 2), (4, 2), (3, 2), (2, 1)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接