python networkx删除某些条件的节点和边

时间:2013-08-15 20:50:42

标签: python set conditional-statements networkx

在python库networkx中,我想删除具有某些属性的图的节点和边。例如,假设我想删除节点的度数<1的所有节点和边缘。 2.考虑以下psuedocode:

vdict = g.degree_dict()         #dictionary of nodes and their degrees
g.remove_from_nodes(v in g s.t. vdict[v] < 2)

我已经看到一些使用集合论符号的语法,但由于我仍然是python的新手,我不知道如何使用它。如何将其转换为工作的python代码?

3 个答案:

答案 0 :(得分:12)

Graph.remove_nodes_from()方法获取节点的列表(实际上是容器)。所以你只需要创建一个满足你条件的列表。您可以使用Python的list comprehension结构来紧凑地创建要删除的节点列表。

In [1]: import networkx as nx

In [2]: G = nx.Graph()

In [3]: G.add_edge(1,2)

In [4]: G.add_edge(1,3)

In [5]: G.add_edge(1,4)

In [6]: G.add_edge(2,3)

In [7]: G.add_edge(2,4)

In [8]: G.degree()
Out[8]: {1: 3, 2: 3, 3: 2, 4: 2}

In [9]: remove = [node for node,degree in G.degree().items() if degree > 2]

In [10]: remove
Out[10]: [1, 2]

In [11]: G.nodes()
Out[11]: [1, 2, 3, 4]

In [12]: G.remove_nodes_from(remove)

In [13]: G.nodes()
Out[13]: [3, 4]

答案 1 :(得分:4)

如果我们有一个初始化的图g,则以下将f设置为g,但要受到每个顶点必须具有度数&gt;的约束。我们可以用变量很容易地概括0:

f = nx.Graph()                                                                                                                                     
fedges = filter(lambda x: g.degree()[x[0]] > 0 and g.degree()[x[1]] > 0, g.edges())
f.add_edges_from(fedges)

答案 2 :(得分:2)

请注意,在Aric的networkx == 2.2中,您需要将G.degree()包装在字典中,因为networkx视图对象没有项方法。这行是:

[node for node,degree in dict(G.degree()).items() if degree > 2]