美文网首页
digraph 操作节点和边的添加修改删除查找方法以及查找前驱后

digraph 操作节点和边的添加修改删除查找方法以及查找前驱后

作者: hehehehe | 来源:发表于2025-03-13 10:55 被阅读0次

在 NetworkX 的 DiGraph(有向图)中,可以通过以下方法操作节点和边,以及查找前驱和后继节点。以下是详细的添加、修改、删除和查找方法:


一、操作节点的方法

1. 添加节点

使用 add_node 方法添加单个节点,可以同时设置属性:

import networkx as nx

# 创建有向图
graph = nx.DiGraph()

# 添加单个节点并设置属性
graph.add_node(1, color="red", size=10)
graph.add_node(2, color="blue", size=20)

# 批量添加节点
graph.add_nodes_from([3, 4, 5])

# 查看所有节点及其属性
print(graph.nodes(data=True))
# 输出: [(1, {'color': 'red', 'size': 10}), (2, {'color': 'blue', 'size': 20}), (3, {}), (4, {}), (5, {})]

2. 修改节点属性

可以直接通过 graph.nodes[node][attribute] 修改节点属性:

# 修改节点属性
graph.nodes[1]["color"] = "green"
graph.nodes[1]["size"] = 15

print(graph.nodes[1])
# 输出: {'color': 'green', 'size': 15}

3. 删除节点

使用 remove_node 方法删除单个节点:

# 删除节点
graph.remove_node(5)

print(graph.nodes(data=True))
# 输出: [(1, {'color': 'green', 'size': 15}), (2, {'color': 'blue', 'size': 20}), (3, {}), (4, {})]

可以批量删除节点:

graph.remove_nodes_from([3, 4])
print(graph.nodes(data=True))
# 输出: [(1, {'color': 'green', 'size': 15}), (2, {'color': 'blue', 'size': 20})]

4. 查找节点

  • 获取所有节点:使用 graph.nodes
  • 判断节点是否存在:使用 graph.has_node(node)
# 获取所有节点
print(list(graph.nodes))  # 输出: [1, 2]

# 判断节点是否存在
print(graph.has_node(1))  # 输出: True
print(graph.has_node(5))  # 输出: False

二、操作边的方法

1. 添加边

使用 add_edge 方法添加单条边,可以同时设置属性:

# 添加单条边
graph.add_edge(1, 2, weight=5, label="A")

# 批量添加边
graph.add_edges_from([(2, 3), (3, 4, {"weight": 10}), (4, 1)])

# 查看所有边及其属性
print(graph.edges(data=True))
# 输出: [(1, 2, {'weight': 5, 'label': 'A'}), (2, 3, {}), (3, 4, {'weight': 10}), (4, 1, {})]

2. 修改边属性

可以直接通过 graph.edges[edge][attribute] 修改边属性:

# 修改边属性
graph.edges[1, 2]["weight"] = 15
graph.edges[1, 2]["label"] = "B"

print(graph.edges[1, 2])
# 输出: {'weight': 15, 'label': 'B'}

3. 删除边

使用 remove_edge 方法删除单条边:

# 删除单条边
graph.remove_edge(1, 2)

print(graph.edges(data=True))
# 输出: [(2, 3, {}), (3, 4, {'weight': 10}), (4, 1, {})]

可以批量删除边:

graph.remove_edges_from([(2, 3), (4, 1)])
print(graph.edges(data=True))
# 输出: [(3, 4, {'weight': 10})]

4. 查找边

  • 获取所有边:使用 graph.edges
  • 判断边是否存在:使用 graph.has_edge(node1, node2)
# 获取所有边
print(list(graph.edges))  # 输出: [(3, 4)]

# 判断边是否存在
print(graph.has_edge(3, 4))  # 输出: True
print(graph.has_edge(1, 2))  # 输出: False

三、查找前驱和后继的方法

在有向图中:

  • 前驱:指向某节点的节点。
  • 后继:某节点指向的节点。

1. 查找某节点的前驱

使用 graph.predecessors(node) 查找某节点的所有前驱节点:

graph.add_edge(1, 2)
graph.add_edge(3, 2)
graph.add_edge(4, 2)

print(list(graph.predecessors(2)))
# 输出: [1, 3, 4]

2. 查找某节点的后继

使用 graph.successors(node) 查找某节点的所有后继节点:

graph.add_edge(2, 5)
graph.add_edge(2, 6)

print(list(graph.successors(2)))
# 输出: [5, 6]

四、其他相关方法

1. 入度和出度

  • 入度:指向某节点的边的数量。
  • 出度:某节点指向的边的数量。

使用 graph.in_degree(node)graph.out_degree(node) 获取入度和出度:

print(graph.in_degree(2))  # 输出: 3 (节点 2 的前驱有 1, 3, 4)
print(graph.out_degree(2))  # 输出: 2 (节点 2 的后继有 5, 6)

2. 获取邻接关系

  • 后继节点:使用 graph[node]graph.adj[node]
  • 前驱节点:使用 graph.pred[node]
# 后继节点
print(graph[2])  # 输出: {5: {}, 6: {}}

# 前驱节点
print(graph.pred[2])  # 输出: {1: {}, 3: {}, 4: {}}

3. 查找入度和出度的节点

使用 graph.in_edges(node)graph.out_edges(node) 获取与某节点有关的入边和出边:

print(graph.in_edges(2))  # 输出: [(1, 2), (3, 2), (4, 2)] (指向节点 2 的边)
print(graph.out_edges(2))  # 输出: [(2, 5), (2, 6)] (从节点 2 出发的边)

五、总结

节点操作方法

  • 添加节点add_nodeadd_nodes_from
  • 删除节点remove_noderemove_nodes_from
  • 修改节点属性:直接通过 graph.nodes[node][attribute] 修改。
  • 查找节点graph.nodes 获取所有节点,graph.has_node(node) 判断节点是否存在。

边操作方法

  • 添加边add_edgeadd_edges_from
  • 删除边remove_edgeremove_edges_from
  • 修改边属性:直接通过 graph.edges[edge][attribute] 修改。
  • 查找边graph.edges 获取所有边,graph.has_edge(node1, node2) 判断边是否存在。

前驱和后继方法

  • 查找前驱graph.predecessors(node)
  • 查找后继graph.successors(node)
  • 入度和出度graph.in_degree(node)graph.out_degree(node)
  • 邻接关系graph[node](后继),graph.pred[node](前驱)。

相关文章

  • 二叉查找树归纳-查找,插入,删除

    二叉查找树主要的操作包括查找指定元素,插入元素,删除指定元素,以及寻找最小节点,最大节点,查找指定元素的前驱或后继...

  • JavaScript基础知识点--DOM操作之节点

    DOM之节点 添加节点 删除节点 修改节点 查找节点 添加节点 create 系列方法 document.crea...

  • 二叉树 堆 2019-04-17

    二叉树 实现一个二叉查找树,并且支持插入、删除、查找操作 实现查找二叉查找树中某个节点的后继、前驱节点 实现二叉树...

  • 前端常见面试题(十四)@郝晨光

    怎样添加、移除、复制、创建、查找节点 创建节点 删除(移除)节点 添加节点 替换节点 复制节点 查找节点通过doc...

  • javascript 与CSS 交互-8.22

    复习 访问指定节点的方法? 查看/修改属性节点? 根据层次关系查找节点? 创建和增加节点? 删除和替换节点的方法?...

  • JS/DOM节点操作

    1.访问节点 2.生成节点 3.添加节点 4.复制节点 5.删除节点 6.修改文本节点 7.属性操作 8.查找节点...

  • 从0开始——查找

    一.查找 1.静态查找要求数据集合是稳定的,不能有添加和删除的查找操作。2.动态查找数据集合在查找的过程中需要添加...

  • 学生信息管理系统

    用户交互 用户可以进行的操作 1. 添加,删除,修改,defaultTableModel 2. 查找(筛选),排序...

  • js和JQuery对DOM增删改查的对比

    查找 JS方法1 查找节点1 查找节点组1 JS方法2 查找节点2 查找节点组2 小结 根据JS和JQuery的对...

  • python 循环单向链表

    单向循环链表python实现 循环链表实现 头节点添加 尾节点添加 插入 删除 查找

网友评论

      本文标题:digraph 操作节点和边的添加修改删除查找方法以及查找前驱后

      本文链接:https://www.haomeiwen.com/subject/ytbvmjtx.html