如何使用包含节点和边的python字典来构建G Networkx?

时间:2018-10-07 20:56:45

标签: python python-3.x networkx

考虑元组列表。此列表将转换为字典,其中主键为节点和边。

示例:

ls = [('a', 1), ('b', 2), ('c', 3), ('a', 2), ('b', 3)]

为了获得此结果,我导入了networkx库。

import networkx as nx
G = nx.Graph()
G.add_edges_from(ls)

但是,当我将 G图转换为node_link_data时:nx.readwrite.json_graph.node_link_data(G)我发现有些项目(源和目标)是倒置的,例如,元组列表被分类为而不是目标

# original tuple
('b', 2)

# node_link_data
links: [
  {'source': 2, 'target': 'b'}
  ...
]

因此,我创建了自己的字典{'nodes': [], 'links': []}

我想使用此字典来创建networkx图。我对使用此库的算法测量节点感兴趣。

我尝试使用:

G = nx.Graph(myDict)

这将返回错误:TypeError: Input is not known type

如何使用已经包含节点和边的字典来构建此图?也许我可以使用其他库来测量度数,聚类等...而是使用其他库。预先感谢

1 个答案:

答案 0 :(得分:0)

因此,问题似乎是某些元组的组织方式不正确,无法从列表到字典进行一致的转换,因此您可以像这样测试元组的索引

ls = [('a', 1), (2, 'b'), (3, 'c'), ('a', 2), ('b', 3)]
links = []
for i in ls:
    try:
        if i[0].isalpha():
            links.append({'source': i[1], 'target': i[0]})
    except AttributeError:
        links.append({'source': i[0], 'target': i[1]})

print(links)
# [{'source': 1, 'target': 'a'}, {'source': 2, 'target': 'b'}, {'source': 3, 'target': 'c'}, {'source': 2, 'target': 'a'}, {'source': 3, 'target': 'b'}]

会发生什么情况,我们测试i[0]的字母是否带有至少一个字符,如果是,则将其追加到目标,并将i[1]追加到源。另一方面,如果碰巧是int,则会引发错误,我们可以使用try/except来捕获该错误,这现在告诉我们int在i[0]中,因此我们可以创建i[0]为源,i[1]为目标的字典。