共同的“外”邻居和共同的“内”邻居

Ala*_*ejo 4 networkx

从一个有向图上,给出两个顶点(v,u),我需要找到:共同的“外”邻居和共同的“内”邻居。

例如:

import networkx as nx

ghybrid = nx.DiGraph()
ghybrid.add_edge("A", "B")
ghybrid.add_edge("A", "C")
ghybrid.add_edge("B", "D")
ghybrid.add_edge("D", "C")
ghybrid.add_edge("E", "A")
ghybrid.add_edge("E", "D")
Run Code Online (Sandbox Code Playgroud)

有向图

我要这个:

# Common out Neighbors
B ,  E :  set(['D'])
E ,  B :  set(['D'])
A ,  D :  set(['C'])
D ,  A :  set(['C'])

# Common in Neighbors
A ,  D :  set(['E'])
D ,  A :  set(['E'])
Run Code Online (Sandbox Code Playgroud)

我可以有共同的“外出”邻居:

def common_out_neighbors(g, i, j):
    return set(g.neighbors(i)).intersection(g.neighbors(j))
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何获得通用的“ Neigbors”。谁能帮我?

Ari*_*ric 5

对于DiGraphs,可以使用predecessorssuccessors方法:

import networkx as nx

def common_out_neighbors(g, i, j):
    return set(g.successors(i)).intersection(g.successors(j))

def common_in_neighbors(g, i, j):
    return set(g.predecessors(i)).intersection(g.predecessors(j))


if __name__ == '__main__':

    ghybrid = nx.DiGraph()
    ghybrid.add_edge("A", "B")
    ghybrid.add_edge("A", "C")
    ghybrid.add_edge("B", "D")
    ghybrid.add_edge("D", "C")
    ghybrid.add_edge("E", "A")
    ghybrid.add_edge("E", "D")
    print common_out_neighbors(ghybrid, 'A', 'D')
    print common_in_neighbors(ghybrid, 'A', 'D')
# output 
# set(['C'])
# set(['E'])
Run Code Online (Sandbox Code Playgroud)