在 Python 中使用生成器进行广度优先树遍历

2023-12-20

我正在 David Beazly 的优秀 Python Cookbook 文本中研究如何在 Python 中使用生成器。以下代码配方非常优雅地使用生成器定义了深度优先树遍历:

# example.py
#
# Example of depth-first search using a generator

class Node:
    def __init__(self, value):
        self._value = value
        self._children = []

    def __repr__(self):
        return 'Node({!r})'.format(self._value)

    def add_child(self, node):
        self._children.append(node)

    def __iter__(self):
        return iter(self._children)

    def depth_first(self):
        yield self
        for c in self:
            yield from c.depth_first()

# Example
if __name__ == '__main__':
    root = Node(0)
    child1 = Node(1)
    child2 = Node(2)
    root.add_child(child1)
    root.add_child(child2)
    child1.add_child(Node(3))
    child1.add_child(Node(4))
    child2.add_child(Node(5))

    for ch in root.depth_first():
        print(ch)
    # Outputs: Node(0), Node(1), Node(3), Node(4), Node(2), Node(5)

我正在尝试想出一个同样优雅的方法

def breadth_first(self):
    pass

我故意不发布我一直在尝试的疯狂内容,因为我尝试过的所有内容都需要在其中维护“状态”。我不想使用传统的基于队列的解决方案。这项学术练习的重点是深入了解生成器的行为方式。因此,我想使用上面的树的生成器创建一个并行的“breadth_first”方法。

欢迎任何指示/解决方案。


您不能使用递归(堆栈)bfs没有一些严重的黑客攻击,但是队列可以工作:

def breadth_first(self):
    q = [self]
    while q:
        n = q.pop(0)
        yield n
        for c in n._children:
            q.append(c)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中使用生成器进行广度优先树遍历 的相关文章

  • C# 的快速线程安全随机数生成器

    我需要在多个正在运行的线程中快速生成随机浮点数 我尝试过使用System Random 但它对于我的需求来说太慢了 并且它在多个线程中返回相同的数字 当我在单线程中运行应用程序时 它工作正常 此外 我需要确保生成的数字在 0 到 100 之
  • Linux 上的 Python 3.6 tkinter 窗口图标错误

    我正在从 Python GUI 编程手册 学习 Python GUI 某项任务要求我通过将以下代码添加到我的配方中来更改窗口图标 Change the main windows icon win iconbitmap r C Python3
  • 内置模块位于哪里?

    我尝试查找列出的所有目录sys path但我找不到任何builtins py文件 那么它在哪里呢 从字面上看 该模块内置于 python 解释器中 gt gt gt import builtins gt gt gt builtins
  • 将 Python 3 与 AWS lambda 结合使用

    可以在 lambda 中使用使用 Python3 构建的应用程序 而不仅仅是 python2 7 可能会考虑周围的选择 https gun io blog announcing zappa serverless python aws lam
  • 如何看待Python的负数按位运算?

    我发现很难思考 Python 和 Python3 的无限精度负数和按位运算 它不是 32 位或 64 位 这1左边的 s 可以被认为是 无穷多个 它不是很明确 这就是为什么有时很难思考它是如何运作的 似乎一种可行的方法是 总是让它更多 例如
  • “初始化 MCI 时出现问题”播放声音问题

    我正在尝试使用 Playsound 播放代码文件夹中的文件 但是每次运行代码时 它似乎都能够调用该文件 但我总是收到以下输出 playsound PlaysoundException Error 277 for command open p
  • Python中矩阵元素的双重求和

    基于下面的简化示例 我想在我的代码中 from sympy import import numpy as np init printing x y symbols x y mat Matrix x 1 1 y X 1 2 3 Y 10 20
  • NotImplementedError:尚未为未构建的模型子类启用“fit_generator”

    我正在使用以下代码 import tensorflow as tf traindata tf keras preprocessing image ImageDataGenerator rescale 1 255 shear range 0
  • 使用python shelve跨平台

    我希望得到关于 Python 中的书架 数据库的一些建议 问题 我在 Mac 上创建了一个数据库 我想在 Windows 7 上使用该数据库 我使用 Python 3 2 MacOS 10 7 和 win 7 当我在 Mac 上打开并保存我
  • Python 3.6 ZeroMQ (PyZMQ) asyncio pub sub Hello World

    我刚刚开始使用 ZeroMQ 我正在尝试让 Hello World 在 Python 3 6 中与 PyZMQ 和 asyncio 一起使用 我试图将模块的功能与发布 订阅代码分离 因此有以下类设置 Edit 1 最小化示例 Edit 2
  • 如何在python 3.6.5中通过变量创建子元素

    我的代码是 import xml etree ElementTree as ET from lxml import etree var1
  • python中将对象数据类型转换为字符串问题

    如何将对象数据类型结构转换为字符串数据类型 下面的方法不起作用 该列仍然存在object转换为字符串后 astype import pandas as pd df pd DataFrame country A B C D E df dtyp
  • python 中的 exec 关键字有什么作用?

    code compile a 1 2
  • 使用 python 生成器高效创建 scipy.lil_matrix

    我有一个生成单一维度的生成器numpy arrays 的长度相同 我想要一个包含该数据的稀疏矩阵 行的生成顺序与我希望它们出现在最终矩阵中的顺序相同 csr矩阵优于lil矩阵 但我认为后者在我描述的场景中更容易构建 假设row gen是一个
  • 如何在 Python 3 中获取当前语言环境的字母表?

    在 Python 2 中 您可以执行以下操作来获取当前语言环境的字符集 import string print string letters 然而 在 Python 3 中 字符串模块的区域设置相关常量 例如string letters s
  • Python - 不使用复制模块的深度复制

    本质上 问题是创建一个函数 deepcopy L 它将返回列表 L 的深层副本 但是 我们被告知不要使用 copy 模块或其中的任何函数 我是入门课程的初学者 老实说我在这方面很挣扎 我们真正被告知的唯一一件事是我们应该使用递归来解决问题
  • Python 3在for循环中更改字典键的值不起作用

    我的 python 3 代码没有按预期工作 def addFunc x y print x y def subABC x y z print x y z def doublePower base exp print 2 base exp d
  • 在python中读取PASCAL VOC注释

    我在 xml 文件中有注释 例如这个 它遵循 PASCAL VOC 约定
  • 如果文件为空,如何跳过文件行

    python 3中的程序 这是我的第一个涉及文件的程序 我需要忽略注释行 以 开头 和空行 然后拆分这些行 以便它们可迭代 但我不断收到 IndexError 消息 指出字符串索引超出范围 并且程序在空行处崩溃 import os path
  • 使用 Python 3 动态插入到 sqlite

    我想使用 sqlite 写入多个表 但我不想提前手动指定查询 有数十种可能的排列 例如 def insert sqlite tablename data list global dbc dbc execute insert into tab

随机推荐

  • 在调用者的返回序列中跳过函数

    在一系列函数调用中 例如 main gt A gt B gt C 当被调用函数完成时 它通常返回到调用函数 例如C 返回到B 这将返回到A etc 我想知道是否也可以直接返回到调用序列中较早的函数 所以C 还给main 并跳过B and A
  • C# 字节数组到固定 int 指针

    是否可以以某种方式转换由fixed 语句创建的指针的类型 情况是这样的 我有一个字节数组 我想对其进行迭代 但是我希望将这些值视为 int 从而使用 int 而不是 byte 这是一些示例代码 byte rawdata new byte 1
  • Three.js:如何缩放和偏移图像纹理?

    如何缩放和偏移图像纹理 我的图像尺寸是 1024 像素 x 1024 像素 var textureMap THREE ImageUtils loadTexture texture png 看一下纹理文档 https threejs org
  • 禁用 UICollectionView 中 UIAttachmnetBehavior 的垂直移动

    我尝试在水平 UICollectionView 中模仿消息应用程序弹簧动画 我在 UICollectionViewFlowLayout 子类中使用了 UIAttachmentBehavior 但问题是 当我水平滚动时 单元格也会垂直和水平移
  • 视图之间快速导航的设计建议

    通常 当视图需要大量绑定或某些 UI 元素 例如 Bing 地图 时 需要 一段时间 来加载 例如半秒到一秒 我不希望 点击 操作 例如点击列表框中的元素 和导航操作 显示新页面 之间出现延迟 我不介意逐步显示页面 例如 对于 Bing 地
  • 查找满足条件的向量内的索引

    我正在寻找一个条件 它将返回满足条件的向量的索引 例如 我有一个向量b c 0 1 0 2 0 7 0 9 我想知道 b gt 0 65 的第一个索引 在这种情况下 答案应该是 3 I tried which min subset b b
  • 刷新后保留通过 jquery 动态生成的输入字段

    我正在使用下面的脚本根据需要生成输入字段 但是 刷新或单击返回提交错误页面时 输入的字段和信息会消失 有什么办法可以在点击返回或刷新页面后保留字段吗 document ready function var MaxInputs 67 var
  • 在 TextInput 中实现 @mention

    如何在React Native的TextInput中实现 mention 我试过这个反应本机提及 https github com harshq react native mentions但它不再被维护了 有很多样式问题和回调问题 我想要的
  • 如何从 npm 模块导入 css 文件 - webcomponent

    我正在尝试在我的应用程序中使用 MDC 组件作为材料设计组件 我在 Polymer LitElement 中有一个自定义元素 render props return html SharedStyles
  • 矢量的小字符串优化?

    我知道几个 全部 STL 实现实现了 小字符串 优化 其中字符串不是存储通常的 3 个指针 用于开始 结束和容量 而是将实际字符数据存储在用于指针的内存中 如果 sizeof characters 我正在考虑通过简单地将向量转换为字符串来实
  • JavaScript 中的 isPrototypeOf

    我是初学者JavaScript在我去的路上JavaScript 中的原型 根据文章here http www w3schools com js js object prototypes asp 创建原型创建对象原型的标准方法是使用对象构造函
  • 实例是否应该使用 setter/getter 来访问自己的私有数据成员?

    从每一门入门编程课程开始 我们都会被教导如何使用访问器和设置器 而不是暴露类的内部工作原理 学生稍后再学习练习的要点 但现在我明白这种做法 A 阻止实现成为合同导出 API 的一部分 B 改进封装和数据隐藏 C 允许保证每当设置或访问变量时
  • Django Queryset 注释字段的绝对值

    如何获取注释字段的绝对值 我尝试了下面的代码 但没有成功 queryset annotate relevance abs F capacity int request GET capacity order by relevance Erro
  • 有没有办法自定义 gitblame 的输出?

    git log有一个不错的 format选项来指定输出的格式 But git blame尽管默认输出为blame不太人性化 我希望看到的少一些 例如 代替 5600cab7 js sidebar VehicleGrid js Rene Sa
  • 更改magento中的愿望清单网址[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个特别的要求 是否可以将整个愿
  • 在 Clojure 中实现 Java 泛型接口

    我正在尝试使用 selenium2 webdriver 项目来掌握 clojure 的窍门网络驱动程序 clj http github com mikitebeka webdriver cljwebdriver 的包装器 然而 由于网络界面
  • Android 中的上下文是如何创建的? ContextThemeWrapper 的目的是什么?

    我正在帮助整理此页面 什么是上下文 https github com codepath android guides wiki Using Context 为了帮助说明组件如何与Context 我通过查看框架源代码创建了这个图 经过一番研究
  • 使用标签或 的灯箱

    是否有任何灯箱实现允许使用 a href a fancybox net 只需很少的工作即可实现这一目标 a href data image each function this fancybox content img attr src t
  • TypingError:在 nopython 模式管道中失败(步骤:nopython 前端)

    我正在尝试使用 numba jit 编写我的第一个函数 我有一个 pandas 数据帧 我需要迭代它并找到每个 350 个点的均方根 因为 python 的 for 循环非常慢 我决定尝试 numba jit 代码是 jit nopytho
  • 在 Python 中使用生成器进行广度优先树遍历

    我正在 David Beazly 的优秀 Python Cookbook 文本中研究如何在 Python 中使用生成器 以下代码配方非常优雅地使用生成器定义了深度优先树遍历 example py Example of depth first