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)]
谢谢您的善意回答。
您提供的代码多次运行时,不能保证返回的边列表完全相同,原因在于 networkx.MultiDiGraph 中的边的顺序是不确定的。虽然每次返回的边和其属性是一致的,但它们的顺序可能会发生变化。
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() 时返回的边顺序可能不同,因为底层的数据结构(如字典或其他容器)没有强制保持顺序。
networkx
edges()
如果您希望多次运行时保证 AllEdges 的顺序一致,可以显式地对列表进行排序。例如,按照 from_node, to_node 和 edge_key 排序:
AllEdges
from_node
to_node
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 列表的顺序就会在每次运行时保持一致。
原始代码不能保证顺序一致,如果您希望保证多次运行时的结果顺序相同,可以使用排序。