将一个多类型嵌套列表转换为一个平面列表。

12 浏览
0 Comments

将一个多类型嵌套列表转换为一个平面列表。

可能重复:
\n在Python中展平(不规则)列表的列表\n我有以下列表 -\n

[1,[2,3],4,[5,[6,7]]]

\n我需要将其展平 -\n

[1,2,3,4,5,6,7]

\n为了做到这一点,我目前使用一个for循环和isinstance,循环的次数为#嵌套 - 1。\n使嵌套列表变平的最简单方法是什么?谢谢。\n一个类似的问题,只涉及将嵌套列表变成平坦列表,可以在这里找到:将嵌套列表变成平坦列表

0
0 Comments

问题的出现原因:

在处理多类型嵌套列表时,需要将其转换为一个平面列表。嵌套列表是指列表中包含其他列表作为元素的情况。例如,[1, 2, [3, 4], 5, [6, [7, 8]]]。在某些情况下,我们需要将这样的嵌套列表转换为一个平面列表,即[1, 2, 3, 4, 5, 6, 7, 8]。

解决方法:

为了实现将多类型嵌套列表转换为平面列表,可以使用递归的方式。递归是一种通过调用自身来解决问题的方法。在这种情况下,递归函数可以遍历列表中的每个元素,并检查其类型。如果元素是列表,则调用递归函数,将其作为参数传递给自身,以便处理内部的嵌套列表。如果元素不是列表,则将其添加到结果列表中。

下面是一个示例解决方法的代码:

def flat(mlist):
    result = []
    for i in mlist:
        if type(i) is list:
            result.extend(flat(i))
        else:
            result.append(i)
    return result

在这个解决方法中,我们定义了一个名为`flat`的函数,它接受一个多类型嵌套列表作为参数。首先,我们创建一个空列表`result`来存储平面列表的结果。

然后,我们使用`for`循环遍历输入列表`mlist`中的每个元素。对于每个元素,我们使用`type(i)`来检查其类型。如果元素的类型是列表,我们调用递归函数`flat`,并将该元素作为参数传递给递归函数。这将处理内部的嵌套列表,并返回结果。我们使用`result.extend()`将返回的结果扩展到`result`列表中。

如果元素的类型不是列表,我们将其直接添加到`result`列表中,使用`result.append(i)`。

最后,我们返回最终的结果列表`result`,其中包含了所有嵌套列表中的元素。

通过调用`flat`函数,并将多类型嵌套列表作为参数传递给它,我们可以得到一个平面列表作为输出。

nested_list = [1, 2, [3, 4], 5, [6, [7, 8]]]
flat_list = flat(nested_list)
print(flat_list)

输出:

[1, 2, 3, 4, 5, 6, 7, 8]

通过上述解决方法,我们成功将多类型嵌套列表转换为了一个平面列表。这对于处理嵌套列表中的元素非常有用,使得它们更容易进行迭代和处理。

0
0 Comments

问题:如何将多类型嵌套列表转换为平面列表?解决方法是什么?

在给出的代码中,我们看到了一个名为“flatten”的函数,用于将多类型嵌套列表转换为平面列表。该函数使用递归的方式来遍历列表和元组,并通过生成器(yield)来返回平面列表的元素。

代码中的flatten函数的实现如下:

def flatten(iterable):
    """Recursively iterate lists and tuples.
    """
    for elm in iterable:
        if isinstance(elm, (list, tuple)):
            for relm in flatten(elm):
                yield relm
        else:
            yield elm

这个函数的作用是,对于给定的可迭代对象(iterable),它会递归地遍历其中的每个元素。如果当前元素是列表或元组,则会再次调用flatten函数来遍历其中的元素。如果当前元素不是列表或元组,则会直接通过yield语句返回该元素。

问题的提问者在这段代码中有困惑的地方是,“for relm in flatten(elm)”这一行的工作方式。他想知道在每次迭代之后,是否会执行“yield relm”这一行。为了帮助他理解这个问题,他希望得到一个干燥运行(dry run)的解释。

干燥运行是一种通过手动执行代码来理解其工作方式的方法。我们可以通过一个具体的例子来进行干燥运行,以便更好地解释代码的工作原理。

假设我们有一个多类型嵌套列表[1, [2, 3], [4, [5, 6]]]作为输入。我们将按照以下步骤来执行代码:

1. 迭代器取出的第一个元素是1,它不是列表或元组,因此通过yield语句返回1。

2. 迭代器取出的第二个元素是[2, 3],它是一个列表。我们需要对这个列表进行递归处理。

3. 对于[2, 3]这个列表,迭代器取出的第一个元素是2,它不是列表或元组,因此通过yield语句返回2。

4. 迭代器取出的第二个元素是3,它不是列表或元组,因此通过yield语句返回3。

5. 递归处理结束,返回到上一级的迭代器。

6. 迭代器取出的第三个元素是[4, [5, 6]],它是一个列表。我们需要对这个列表进行递归处理。

7. 对于[4, [5, 6]]这个列表,迭代器取出的第一个元素是4,它不是列表或元组,因此通过yield语句返回4。

8. 迭代器取出的第二个元素是[5, 6],它是一个列表。我们需要对这个列表进行递归处理。

9. 对于[5, 6]这个列表,迭代器取出的第一个元素是5,它不是列表或元组,因此通过yield语句返回5。

10. 迭代器取出的第二个元素是6,它不是列表或元组,因此通过yield语句返回6。

11. 递归处理结束,返回到上一级的迭代器。

12. 迭代器处理结束,整个函数执行完毕。

通过这个干燥运行的例子,我们可以看到代码是如何通过递归地遍历多类型嵌套列表,并通过yield语句来返回平面列表的元素的。

在代码中的注释部分,还提到了对可迭代对象的测试方法可以改进。可以通过检查是否存在__iter__方法或是否是collections.Iterable抽象基类的实例来进行改进。

另外,问题的提问者还指出这个问题可能是一个重复的问题,并引用了一个链接的问题。

这篇文章讲述了如何将多类型嵌套列表转换为平面列表的问题,给出了解决方法,并通过干燥运行的例子来解释了代码的工作原理。

0