当前位置: 首页 > 面试题库 >

递归生成器,用于展平嵌套列表

闾丘昊然
2023-03-14
问题内容

我是一名编程新手,在理解python教科书(Magnus Lie Hetland的“ Beginning
Python”)中的示例时遇到了一些麻烦。该示例针对的是递归生成器,该生成器旨在展平嵌套列表的元素(具有任意深度):

def flatten(nested):
    try:
        for sublist in nested:
            for element in flatten(sublist):
                yield element
    except TypeError:
        yield nested

然后,您将输入嵌套列表,如下所示:

>>> list(flatten([[[1],2],3,4,[5,[6,7]],8]))
[1,2,3,4,5,6,7,8]

我了解flatten()中的递归如何帮助缩小到此列表的最内层元素“ 1”,但是我不明白的是当“
1”实际上作为“嵌套”传递回flatten()时会发生什么’。我以为这会导致TypeError(无法遍历一个数字),并且异常处理实际上是为产生输出而进行的繁重工作……但是使用经过修改的flatten()版本进行的测试使我确信事实并非如此。相反,似乎“收益要素”行是负责任的。

就是说,我的问题是……如何实际执行“屈服要素”?看起来“嵌套”将是一个列表-在这种情况下,将添加另一层递归-或者是一个数字,并且您会收到TypeError。

对此的任何帮助将不胜感激…特别是,我希望逐步了解事件链,因为flatten()处理以下简单示例:

list(flatten([[1,2],3]))

问题答案:

我向该功能添加了一些检测功能:

def flatten(nested, depth=0):
    try:
        print("{}Iterate on {}".format('  '*depth, nested))
        for sublist in nested:
            for element in flatten(sublist, depth+1):
                print("{}got back {}".format('  '*depth, element))
                yield element
    except TypeError:
        print('{}not iterable - return {}'.format('  '*depth, nested))
        yield nested

现在打电话

list(flatten([[1,2],3]))

显示

Iterate on [[1, 2], 3]
  Iterate on [1, 2]
    Iterate on 1
    not iterable - return 1
  got back 1
got back 1
    Iterate on 2
    not iterable - return 2
  got back 2
got back 2
  Iterate on 3
  not iterable - return 3
got back 3


 类似资料:
  • 我的数据结构如下所示: Foo的每个实例都可以包含任意数量的S,这当然反过来又可以包含更多的S等等。那么,我该如何让FreeMarker通过这样的列表呢?

  • 我有内部节点和终端节点的树状结构: 我现在有一个

  • 问题内容: 给定一个,其中值是a 或另一个,那么如何使用Java 8将地图展平到单个值列表? 例: 对于上面的示例,我想要以下列表: 我知道可以这样做: 我该如何使用? 编辑: 经过一番游戏后,我发现了: 问题答案: 您可以定义一个递归方法来展平一个地图并将其用作函数或直接调用它来使用。 例: 对于给定的嵌套地图,它会打印 [value1,value2,value3.1,value3.2,valu

  • 我想我理解了教科书中对尾部递归函数的定义:在函数调用后不执行任何计算的函数。我还发现,作为一个结果,尾部递归函数的内存效率会更高,因为它每次调用只需要一条记录,而不是每次都需要保留一条记录(就像在普通递归中那样)。 我不太清楚的是,这个定义如何应用于嵌套调用。我将提供一个例子: 我最初给出的答案是,根据定义,它不是尾部递归的(因为外部调用是在计算内部调用之后执行的,所以其他计算是在第一次调用之后完

  • 我正在练习并试图写一个递归数组扁平化函数。代码在这里: 问题是,如果我将一个数组或嵌套数组传递给它,就会出现“超出最大调用堆栈大小”错误。我做错了什么?

  • 问题内容: 我正在尝试创建文件查看器,并且想嵌套子目录。我正在使用ui-router,我希望每个子目录都有其自己的URL和状态。 说我有以下结构: 我希望我的路线是: 我想递归地执行此操作,而不是为每个子目录创建一个新状态 问题答案: 我建议用 一种状态 和 一种参数 - 来做。因为应该尽快定义所有状态,以支持url路由。所有这些唯一的folderPath可能不同,也可能是动态的-在运行时中,在应