保留边的顺序以将边权重添加到 Networkx 图

Preserving order of edges for adding edge weights to a Networkx graph

我有以下图表,

ed_ls = [(0, 1), (0, 63), (1, 2), (1, 3), (54, 0)]
ed_w = [1, 2, 3, 4, 5]
G = nx.Graph()
G.add_edges_from(ed_ls)
edge_w = OrderedDict(zip(G.edges, ed_w))
nx.set_edge_attributes(G, edge_w, 'weight')

print(G.edges)
print(nx.get_edge_attributes(G, 'weight'))

获得的输出:

{(0, 1): 1, (0, 63): 2, (0, 54): 3, (1, 2): 4, (1, 3): 5}

ed_w 中的边权重与 ed_ls 中的边顺序相同。由于边的顺序 未保留,分配了错误的边权重。我可以使用 nx.DiGraph 来避免这个问题。但是,我想稍后使用 nx.k_core,这不适用于有向图。关于的建议 如何继续将受到高度赞赏。

为什么不在将边添加到图中时将权重分配给边?

ed_ls = [(0, 1), (0, 63), (1, 2), (1, 3), (54, 0)]
ed_w = [1, 2, 3, 4, 5]
G = nx.Graph()

for i in range(len(ed_ls)):
    src, dst = ed_ls[i]
    G.add_edge(src, dst, weight=ed_w[i])

您可以使用 Graph.add_weighted_edges_from 来简化此操作:

ed_ls = [(0, 1), (0, 63), (1, 2), (1, 3), (54, 0)]
ed_w = [1, 2, 3, 4, 5]

G = nx.Graph()
G.add_weighted_edges_from(((*edge, w) for edge, w in zip(ed_ls, ed_w)))

G.edges(data=True)
EdgeDataView([(0, 1, {'weight': 1}), (0, 63, {'weight': 2}), 
              (0, 54, {'weight': 5}), (1, 2, {'weight': 3}), 
              (1, 3, {'weight': 4})])

如果您使用的是 3.7 以上的 python 版本,字典会保持插入顺序,但您在打印 G.edges(data=True) 时看到的顺序不一定是边添加的顺序,而是同意节点添加。如您在此示例中所见,(54, 0) 显示在前面 (1, 2) 因为之前添加了节点 0