我试图实现一个平坦的函数,即使是扁平的字符串,但得到了一个递归错误。有人能帮我解决这个难题吗?
def flatten(items):
for x in items:
if isinstance(x, Iterable):
yield from flatten(x)
else:
yield x
items = [2, [3, 4, [5, 6], 7], 8, 'abc']
for x in flatten(items):
print(x)我本来想打印'2,3,4,5,6,7,8,a,b,c‘,但是我得到了'2,3,4,5,6,7,8和一个RecursionError。我认为'abc’也是'Iterable',那么为什么代码不能工作呢?
谢谢!
发布于 2022-11-30 19:54:51
jasonharper指出的问题是'a‘是一个可迭代的元素,其中包含'a’等等。但是,您可以在yield from flatten(x)之前用另一个代码重写代码,比如
from collections.abc import Iterable
def flatten(items):
for x in items:
if isinstance(x, Iterable):
if len(x)==1:
yield next(iter(x))
else:
yield from flatten(x)
else:
yield x
items = [2, [3, 4, [5, 6], 7], 8, 'abc']
for x in flatten(items):
print(x)发布于 2022-12-01 00:23:58
之所以会出现这种情况,是因为您超出了调用堆栈的限制--我不会在这里讨论这个问题,但是,您可以阅读本文:https://towardsdatascience.com/python-stack-frames-and-tail-call-optimization-4d0ea55b0542
递归是一个棘手的问题,在我个人看来,如果可能的话,最好避免递归。如果您重构代码以使用最少数量的递归,并在字符串值上使用内置的iter()函数,那么它在不像这样退出调用堆栈的情况下工作。
from collections.abc import Iterable
def flatten(items):
for x in items:
if isinstance(x, str):
yield from iter(x)
elif isinstance(x, Iterable):
yield from flatten(x)
else:
yield x
items = [2, [3, 4, [5, 6], 7], 8, 'abc']
for x in flatten(items):
print(x)https://stackoverflow.com/questions/74633320
复制相似问题