python实现dict版图遍历示例


下面是一个使用Python实现的字典(dict)图遍历的示例。这里我们假设字典的图结构是通过键(key)和值(value)之间的引用关系构建的,其中值可能是另一个字典,表示图的下一个节点。为了简化,我们不会涉及复杂的图结构(如环或重边),而是展示一个基本的遍历方法。

我们将使用深度优先搜索(DFS)作为遍历策略,因为它能很好地展示递归在遍历图结构时的应用。


def dfs(node, visited=None):
    """
    使用深度优先搜索遍历字典图。

    :param node: 当前遍历到的字典节点
    :param visited: 已经访问过的节点集合,默认为None,表示首次调用
    """
    if visited is None:
        visited = set()  # 初始化已访问节点集合

    if node is None or id(node) in visited:  # 如果节点为空或已被访问,则跳过
        return

    visited.add(id(node))  # 将当前节点标记为已访问
    print(node)  # 处理当前节点,这里简单地打印出来

    # 遍历当前节点的所有子节点(假设子节点是字典的values)
    for value in node.values():
        if isinstance(value, dict):  # 只对字典类型的值进行递归遍历
            dfs(value, visited)

# 示例字典图
graph = {
    'A': {'B': {}, 'C': {'D': {}}},
    'E': {'F': {}, 'G': {'H': {}}},
}

# 开始遍历
dfs(graph)

注意:

1. 我们使用`id(node)`来唯一标识一个字典,因为Python中的字典是可变类型,直接使用`node`作为`visited`集合的元素可能会导致问题(例如,当两个字典内容相同但不是同一个对象时)。

2. 这里的“图”是通过字典的嵌套来表示的,每个字典可能包含其他字典作为值,从而形成一个图结构。

3. `dfs`函数接受一个`visited`参数,这是一个集合,用于记录已经访问过的节点。在递归调用时,我们传递这个集合,以确保不会重复访问同一个节点,从而避免无限递归。

4. 我们使用`print(node)`来简单地处理每个节点,但你可以根据实际需求替换为其他逻辑。