递归函数返回所有连接节点的列表,使用python从网络图给定某个节点

时间:2016-12-29 08:54:15

标签: python recursion networkx

我尝试编写一个函数,该函数将返回子网中所有连接节点的列表,给定子图中的起始节点:

例如,下图有两个子网,一个红色,一个绿色,如下图所示:

enter image description here

使用名为networkx的python软件包,我运行了以下代码:

import networkx as nx
import pandas as pd
import numpy as np

G=nx.Graph()

G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_node(4)
G.add_node(5)
G.add_node(6)

G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(1,5)
G.add_edge(4,6)

def recurse(G, z , node):
    z.append(node)
    n = list(set(G.neighbors(node)) - set(z)) 
    if len(n) == 0:
        return []
    else:
        for i in n:
            if i not in z:
                z.extend(recurse(G, z, i))
                return z

z = []
f = recurse(G,z,1)
print(f)

该函数应该返回子组 - > [1,2,3,5]当给定(1)作为起始节点但返回[1,2,3,1,2,3]

我是如何通过调整代码或使用其他方法来执行此任务的?

谢谢!

1 个答案:

答案 0 :(得分:2)

如果您对访问节点的顺序不感兴趣,您可以执行DFS并将访问过的节点收集到set

def recurse(G, z, node):
    z.add(node)
    for i in G.neighbors(node):
        if i not in z:
            recurse(G, z, i)

z = set()
recurse(G,z,1)
print(z) # {1, 2, 3, 5}