2014-10-16 2 views
0

Я создаю направленное дерево, используя pydot и визуализируя его. Это хорошо, но я также хотел бы получить листовые узлы дерева. Как я могу это сделать?получить все листовые узлы ориентированного графа в pydot

В общем, вопрос заключается в том, как обращаться к узлам и ребрам, которые хранятся внутри объекта pydot. Предоставляет ли 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} 

Он должен работать для вас.

+0

В конце концов, я перешел на NetworkX пакет, который является очень гибким и манипулятивной, чем этот pydot пакет. – bikashg

+0

Это хороший выбор. –

0

Это может сбой, когда график строится только из ребер без указания узлов непосредственно.

я предлагаю следующую процедуру:

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) 

Это включает отдельные узлы а

Смежные вопросы