小能豆

networkx.MultiDiGraph.edges 方法是否保序?

py

MyNetwork 是 networkx.MultiDiGraph 的一个实例。我想知道多次运行以下代码是否能保证产生完全相同的列表,其中包含 MyNetwork 中的所有边(以及边属性):

AllEdges = [(from_node,to_node,edge_key,edge_attributes) for (from_node,to_node,edge_key,edge_attributes) in MyNetwork.edges(keys=True,data=True)] 

谢谢您的善意回答。


阅读 13

收藏
2024-11-18

共1个答案

小能豆

您提供的代码多次运行时,不能保证返回的边列表完全相同,原因在于 networkx.MultiDiGraph 中的边的顺序是不确定的。虽然每次返回的边和其属性是一致的,但它们的顺序可能会发生变化。

代码分析:

  • MyNetwork.edges(keys=True, data=True) 会返回图中所有的边,每条边由 (from_node, to_node, edge_key, edge_attributes) 四个元素组成。
  • keys=True 确保返回的每条边都包括一个 edge_key,这对于 MultiDiGraph 类型的图(允许两节点之间有多条边)是必要的。
  • data=True 确保返回的边包含边的属性。

为什么顺序可能不同:

networkx 中,edges() 方法并没有保证返回的边的顺序是固定的,尤其是对于 MultiDiGraph 类型的图。即使图的内容没有发生变化,每次调用 edges() 时返回的边顺序可能不同,因为底层的数据结构(如字典或其他容器)没有强制保持顺序。

保证边的顺序一致:

如果您希望多次运行时保证 AllEdges 的顺序一致,可以显式地对列表进行排序。例如,按照 from_node, to_nodeedge_key 排序:

AllEdges = sorted(
    [(from_node, to_node, edge_key, edge_attributes) 
     for (from_node, to_node, edge_key, edge_attributes) in MyNetwork.edges(keys=True, data=True)],
    key=lambda x: (x[0], x[1], x[2])  # 按照 from_node, to_node 和 edge_key 排序
)

这样,AllEdges 列表的顺序就会在每次运行时保持一致。

结论:

原始代码不能保证顺序一致,如果您希望保证多次运行时的结果顺序相同,可以使用排序。

2024-11-18