我编写了一个递归算法来遍历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']
为什么会这样?非常感谢
答案 0 :(得分:2)
traverse
返回一个生成器对象。因此,在traverse
调用中,您必须循环返回的结果并产生每个值,或者使用语句yield from
:
for child in parent:
yield from traverse(child)
但是,您当前的解决方案以RecursionError: maximum recursion depth exceeded
失败,因为您只捕获了整数值上的迭代次数(这引发了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']