【问题标题】:get all leaf nodes of a directed graph in pydot在pydot中获取有向图的所有叶节点
【发布时间】:2014-12-11 14:32:30
【问题描述】:

我使用 pydot 创建了一个有向树并将其可视化。这很好,但我也想检索树的叶节点。我该怎么做?

一般来说,问题是如何访问存储在 pydot 对象中的节点和边。 pydot 提供这个功能还是只是一个可视化引擎?

【问题讨论】:

    标签: python directed-graph pydot


    【解决方案1】:

    本质上只是一个可视化引擎。 但是有一些功能可以用来解决你的问题:

    >>> import pydot
    >>> g = pydot.Dot(graph_type="digraph")
    >>> g.add_node(pydot.Node(name="A"))
    >>> g.add_node(pydot.Node(name="B"))
    >>> g.add_node(pydot.Node(name="C"))
    >>> g.add_node(pydot.Node(name="D"))
    >>> g.add_edge(pydot.Edge("A","B"))
    >>> g.add_edge(pydot.Edge("A","C"))
    >>> g.add_edge(pydot.Edge("C","D"))
    >>> g.get_nodes()
    [<pydot.Node object at 0x1de1510>, <pydot.Node object at 0x1de1590>, <pydot.Node object at 0x7fb93407afd0>, <pydot.Node object at 0x1dd20d0>]
    >>> leafs = {n.get_name():True for n in g.get_nodes()}
    >>> for e in g.get_edge_list():
    ...     leafs[e.get_source()] = False
    ... 
    >>> leafs
    {'A': False, 'C': False, 'B': True, 'D': True}
    

    它应该适合你。

    【讨论】:

    • 最终,我切换到了 networkx 包,它比这个 pydot 包更灵活和可操作。
    【解决方案2】:

    当图表仅从边构建而不直接指定节点时,这可能失败

    我建议以下程序:

    leafs = set(g.get_nodes())
    remove = set()
    for e in g.get_edges():
        remove.add(e.get_source())
        leafs.add(e.get_destination())
    
    leafs.difference_update(remove)
    

    这也包括孤立节点

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 2010-10-27
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 2023-02-16
      • 2012-05-04
      相关资源
      最近更新 更多