嵌套列表上的递归需要一些支持

问题描述 投票:0回答:1

当然,您可以按照以下方式重新表述您的问题以符合 Stack Overflow 标准:


我无法理解 Python 中的

else
语句以及它如何在展平列表和使用递归的上下文中使用。

我遇到了这个用于压平列表的代码片段:

def flatten_list(lst):
    if not isinstance(lst, list):
        return [lst]
    elif not lst:
        return []
    else:
        return flatten_list(lst[0]) + flatten_list(lst[1:])

my_list = [1, 2, 3, [4, 5, 6], [7, 8, 9, [10, 11], 12], 13, 14]

print(flatten_list(my_list))

我尝试在 PythonTutor 上运行这段代码来可视化执行过程,但我仍然很难掌握算法的工作原理,特别是递归方面。有人可以提供更清晰的解释或逐步分解该算法如何使用递归压平嵌套列表吗?谢谢!

python-3.x list recursion nested-lists
1个回答
0
投票
def flatten_list(lst):

如何“压平”物体?嗯,这取决于该对象是什么。


    if not isinstance(lst, list):
        return [lst]

如果对象不是列表,我们假设它已经是“扁平的”。但我们希望始终返回一个列表,因此我们将其单独包装在一个列表中(长度为 1)并返回。

通过返回,我们停止执行并且不查看接下来的情况。


    elif not lst:
        return []

但是如果对象一个列表,并且它是

not lst
),我们返回一个空列表。


    else:

现在是棘手的部分。该对象一个列表(否则它会被第一个

if
捕获),并且它not空(否则它会被第一个
elif
捕获)。所以我们必须展平实际的对象列表。

但是嘿,这是进步!


        return flatten_list(lst[0]) + flatten_list(lst[1:])

要展平非空列表,请展平第一个元素(如有必要,将其包装在长度为 1 的列表中),并将其添加到列表的展平其余部分

lst[1:]

因为我们知道列表不为空,所以它总是有一个“第一个元素”。如果第一个元素是列表,我们会将其展平,如果它是对象,我们会将其包装在列表中。所以

flatten_list(lst[0])
的结果是一个扁平列表。

现在,列表的其余部分

lst[1:]
可能为空,也可能不为空。但这没关系,因为
flatten_list
知道如何处理空列表!

因此,我们只需对列表的其余部分重复该过程,处理每个“列表的其余部分”的第一个元素,直到处理整个列表。


这就是您获得平面列表的方式。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.