图构建:
>>> import networkx as nx
>>> G = nx.DiGraph()
>>> G.add_edges_from([('n', 'n1'), ('n', 'n2'), ('n', 'n3')])
>>> G.add_edges_from([('n4', 'n41'), ('n1', 'n11'), ('n1', 'n12'), ('n1', 'n13')])
>>> G.add_edges_from([('n2', 'n21'), ('n2', 'n22')])
>>> G.add_edges_from([('n13', 'n131'), ('n22', 'n221')])
>>> G.add_edges_from([('n131', 'n221'), ('n221', 'n131')]
>>> G.add_node('n5')
使用out_degree函数查找所有具有子节点的节点:
>>> [k for k,v in G.out_degree().iteritems() if v > 0]
['n13', 'n', 'n131', 'n1', 'n22', 'n2', 'n221', 'n4']
请注意,n131 和 n221 也出现在此处,因为它们彼此都有优势。如果你愿意,你可以过滤掉这些。
所有没有子节点的节点:
>>> [k for k,v in G.out_degree().iteritems() if v == 0]
['n12', 'n11', 'n3', 'n41', 'n21', 'n5']
所有孤立节点,即度数为 0 的节点:
>>> [k for k,v in G.degree().iteritems() if v == 0]
['n5']
要获取所有孤立的“边”,您可以获取图形的组件列表,过滤掉不包含的组件n
,然后只保留有边的组件:
>>> [G.edges(component) for component in nx.connected_components(G.to_undirected()) if len(G.edges(component)) > 0 and 'n' not in component]
[[('n4', 'n41')]]
具有 2 个以上子节点的节点:
>>> [k for k,v in G.out_degree().iteritems() if v > 2]
['n', 'n1']
如果你遍历树,你不会得到一个无限循环。NetworkX 具有对此稳健的遍历算法。