代码之家  ›  专栏  ›  技术社区  ›  Ramiro Tormenta

如何使用包含节点和边的python dict构建g networkx?

  •  1
  • Ramiro Tormenta  · 技术社区  · 6 年前

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

    例子:

    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': []} .

    我想用这个dict创建networkx图。我对使用这个库的算法来测量节点感兴趣。

    我尝试使用:

    G = nx.Graph(myDict)
    

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

    如何使用已经包含节点和边的dict构建此图?或者,我可以使用其他库来度量度、集群等。而是使用其他库。提前谢谢

    1 回复  |  直到 6 年前
        1
  •  0
  •   vash_the_stampede    6 年前

    因此,问题似乎是有些元组没有正确地组织,无法从列表到字典进行一致的转换,您可以这样做:测试这些元组的索引

    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在 我[ 0 ] 所以我们可以用 我[ 0 ] 作为来源和 我[ 1 ] 作为目标。