【发布时间】:2014-12-11 14:32:30
【问题描述】:
我使用 pydot 创建了一个有向树并将其可视化。这很好,但我也想检索树的叶节点。我该怎么做?
一般来说,问题是如何访问存储在 pydot 对象中的节点和边。 pydot 提供这个功能还是只是一个可视化引擎?
【问题讨论】:
标签: python directed-graph pydot
我使用 pydot 创建了一个有向树并将其可视化。这很好,但我也想检索树的叶节点。我该怎么做?
一般来说,问题是如何访问存储在 pydot 对象中的节点和边。 pydot 提供这个功能还是只是一个可视化引擎?
【问题讨论】:
标签: python directed-graph pydot
本质上只是一个可视化引擎。 但是有一些功能可以用来解决你的问题:
>>> 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}
它应该适合你。
【讨论】:
当图表仅从边构建而不直接指定节点时,这可能失败。
我建议以下程序:
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)
这也包括孤立节点
【讨论】: