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

标签 python recursion

我是一名编程新手,在理解我的 Python 教科书(Magnus Lie Hetland 的“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”行负责。

即是说,我的问题是……如何实际执行“让步元素”?看起来“嵌套”要么是一个列表——在这种情况下添加了另一层递归——要么它是一个数字,你会得到一个 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

关于python - 用于展平嵌套列表的递归生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11377208/

相关文章:

python - Pandas DataFrame.agg 在选择缺失类别后生成多重索引

python - PySpark:如何检查数据框中是否存在字符串值列表并将值打印到列表中

java - 递归调用中的 StackOverFlow 异常

java - 递归创建文件夹

Python:删除 NaN 命名的列

Python3命令使mac崩溃

c# - C# 中的 Struct.Pack 等价物?

c++ - 我碰到了这个代码片段,不明白。它递归检查c++字符串中是否存在大写字符

recursion - F# 中具有内存功能的递归阶乘函数

recursion - 导出文件期间检测到打开代码语句递归