首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >for循环中的'RecursionError‘

for循环中的'RecursionError‘
EN

Stack Overflow用户
提问于 2022-11-30 19:42:14
回答 2查看 41关注 0票数 0

我试图实现一个平坦的函数,即使是扁平的字符串,但得到了一个递归错误。有人能帮我解决这个难题吗?

代码语言:javascript
复制
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',那么为什么代码不能工作呢?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2022-11-30 19:54:51

jasonharper指出的问题是'a‘是一个可迭代的元素,其中包含'a’等等。但是,您可以在yield from flatten(x)之前用另一个代码重写代码,比如

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2022-12-01 00:23:58

之所以会出现这种情况,是因为您超出了调用堆栈的限制--我不会在这里讨论这个问题,但是,您可以阅读本文:https://towardsdatascience.com/python-stack-frames-and-tail-call-optimization-4d0ea55b0542

递归是一个棘手的问题,在我个人看来,如果可能的话,最好避免递归。如果您重构代码以使用最少数量的递归,并在字符串值上使用内置的iter()函数,那么它在不像这样退出调用堆栈的情况下工作。

代码语言:javascript
复制
    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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74633320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档