使用Python Networkx实现带权邻接列表

3

我用以下结构在Python中定义了一个图:

graph = {
    "A": {"B": 10, "C": 3},
    "B": {"C": 1, "D": 2},
    "C": {"B": 4, "D": 8, "E": 2},
    "D": {"E": 7},
    "E": {"D": 9}
}

有没有办法将此内容读入到networkx中呢?
我尝试过G = nx.read_adjlist(graph),并查看了一些json方法,但似乎都不太适合我的应用场景。请参考这里的相关信息。

你尝试过from_dict_of_dicts或者只是nx.Graph(graph)吗? - tomjn
没有成功 - nx.Graph(graph) 没有捕获权重(据我所知使用 vars(G)),而 from_dict_of_dicts 给出了 TypeError: 'int' object is not iterable - Robin Andrews
1个回答

3
你最合适的方法是使用 nx.from_dict_of_dicts。但它使用的字典格式略有不同。它使用一个只有单个'weight'元素的字典代替你拥有的权重数值:

{"E": 7} -> {"E": {"weight": 7}}

因此,您需要使用以下代码转换您的graph字典:

import networkx as nx

graph = {
    "A": {"B": 10, "C": 3},
    "B": {"C": 1, "D": 2},
    "C": {"B": 4, "D": 8, "E": 2},
    "D": {"E": 7},
    "E": {"D": 9}
}

# Convert integer weights to dictionaries with a single 'weight' element
gr = {
    from_: {
        to_: {'weight': w}
        for to_, w in to_nodes.items()
    }
    for from_, to_nodes in graph.items()
}

G = nx.from_dict_of_dicts(gr, create_using=nx.DiGraph)
G.edges.data('weight')

输出:

OutEdgeDataView([
('D', 'E', 7),
('B', 'D', 2),
('B', 'C', 1),
('A', 'B', 10),
('A', 'C', 3),
('C', 'E', 2),
('C', 'B', 4),
('C', 'D', 8),
('E', 'D', 9)
])

P.S. gr 字典长这样:

{'A': {'B': {'weight': 10}, 'C': {'weight': 3}},
 'B': {'C': {'weight': 1}, 'D': {'weight': 2}},
 'C': {'B': {'weight': 4}, 'D': {'weight': 8}, 'E': {'weight': 2}},
 'D': {'E': {'weight': 7}},
 'E': {'D': {'weight': 9}}}

谢谢 - 这是一个非常棒的代码片段,用于转换字典! - Robin Andrews

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