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

2024-04-21

我是一名编程新手,在理解我的 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() 的修改版本进行测试已经说服了我事实并非如此。相反,似乎是“yield element”行负责。

也就是说,我的问题是......“yield element”如何实际执行?看起来“嵌套”要么是一个列表——在这种情况下会添加另一层递归——要么它是一个数字,你会得到一个类型错误。

对此的任何帮助将不胜感激......特别是,我很乐意了解事件链,因为 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]))

displays

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于展平嵌套列表的递归生成器 的相关文章

随机推荐