Python 如何在NetworkX中收缩只有两条边的节点?

Python 如何在NetworkX中收缩只有两条边的节点?,python,graph,networkx,Python,Graph,Networkx,我在NetworkX中有一个大致如下的图表: a---b---c---d | e---f 我想简化它,删除只有两条边的中间节点 a---b---d | f 如何在NetworkX中实现这一点?我只看到删除节点方法或收缩边。但这与节点有关。可以按如下方式进行: for node in list(G.nodes()): if G.degree(node) == 2: edges = list(G.edges(node)) G

我在NetworkX中有一个大致如下的图表:

a---b---c---d
    |
    e---f
我想简化它,删除只有两条边的中间节点

a---b---d
    |
    f

如何在NetworkX中实现这一点?我只看到删除节点方法或收缩边。但这与节点有关。

可以按如下方式进行:

for node in list(G.nodes()):
    if G.degree(node) == 2:
        edges = list(G.edges(node))
        G.add_edge(edges[0][1], edges[1][1])
        G.remove_node(node)

@zohar.kom的更清晰版本将使用子图方法:

import networkx as nx
import matplotlib.pyplot as plt

graph = nx.random_graphs.watts_strogatz_graph(100, 3, .4)

threshold = 2
sub       = graph.subgraph([node for node in graph.nodes() if \
                            graph.degree(node) != threshold])

fig, ax = plt.subplots(2, 1)

nx.draw(graph, ax = ax[0], with_labels = 1)
nx.draw(sub, ax = ax[1], with_labels = 1)

看一看:1。我假设您的意思是
[如果graph.degree(node)!=threshold,则为graph.nodes()中的节点指定节点]
,否则我们将只获取要删除的节点,而不是实际需要的节点。2.这是不够的,因为您只删除相关节点,这很好,但您还需要添加边。例如,原始示例中的边(b,f)将在该实现中丢失。ah没有正确读取它。你是对的,那么这种方法是没有意义的。谢谢你指出这一点。