python - 为什么这个简单的递归树遍历算法会失败?
问题描述
我编写了一个递归算法来遍历 Python 中的嵌套迭代器。我不明白为什么它成功打印出元素,但未能将它们作为生成器生成。
虽然我设法打印出元素:
tree = [[1,2],[3,[['abcde',['f']],'gh']]]
def traverse_printing(parent):
try:
for child in parent:
traverse(child)
except TypeError:
print(parent)
>>> traverse_printing(tree)
1
2
3
a
b
c
...
我正在努力把它变成发电机。
def traverse(parent):
try:
for child in parent:
traverse(child)
except TypeError:
yield parent
traverse(tree)
目前不工作。结果是:
>>> list(traverse(tree))
[]
预期的结果是[1,2,3,'a','b','c','d','e','f','g','h']
为什么会这样?非常感谢
解决方案
traverse
返回一个生成器对象。因此,在traverse
调用时,您必须遍历返回的结果并产生每个值或使用语句yield from
:
for child in parent:
yield from traverse(child)
但是,您当前的解决方案因 a 失败,RecursionError: maximum recursion depth exceeded
因为您仅捕获整数值上的迭代发生(引发 a TypeError
)。循环遍历字符串是 Python 中的有效操作,因此是无限递归调用。因此,您将需要检查的实际类型parent
:
def traverse(parent):
if isinstance(parent, str):
yield from parent
elif isinstance(parent, int):
yield parent
else:
for child in parent:
yield from traverse(child)
list(traverse(tree))
输出:
[1, 2, 3, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
推荐阅读
- ruby-on-rails - 在同一个 Rails 模型中创建孙子关联
- ag-grid - 如何让 datepicker 在全行编辑模式下使用 ag-grid-react
- python-3.x - Replacing values in a dataframe from a list
- swift - 致命错误:对类 '__lldb_expr_1.B' 使用未实现的初始化程序 'init(...)'
- javascript - 通过脚本设置团队驱动文件的权限
- php - 加入多对多关系 Symfony4 与 Doctrine
- javafx - 如何在不实际渲染的情况下从 Javafx 图表(折线图)获取图像文件?
- pip - Python gRPC 是否依赖于 libssl.so.1.1?
- java - 如何向玩家发牌?
- apache-spark - 插入期间火花databricks集群noclassdeffounderror