Python:如何循环遍历一个深度不同的列表的列表?

11 浏览
0 Comments

Python:如何循环遍历一个深度不同的列表的列表?

我有一个像这样的数据结构(实际的嵌套列表非常长且深度不定)。我事先知道它们的深度。

我想循环遍历每个单独的列表。如何最好地实现这个?

我不想像这样做:

for l in a:
    if isinstance(l, list):
        for ll in l:
            if isinstance(ll, list): 
                ...

0
0 Comments

问题的出现原因:这个问题的出现是因为需要对一个包含多个列表的复合列表进行展开操作,即将复合列表展开为一个一维列表。

解决方法:可以使用递归和生成器的组合来解决这个问题。首先定义一个名为flatten_list的函数,接受一个列表作为参数。在函数内部,使用isinstance函数判断当前元素是否为列表类型。如果是列表类型,则使用两层for循环对列表进行遍历,递归调用flatten_list函数,生成一个生成器对象。如果不是列表类型,则使用yield语句将当前元素作为生成器的元素返回。最后,在代码的最后一行,定义一个复合列表my_compound_list,并使用列表推导式将生成器中的元素依次取出,形成一个展开后的一维列表,并打印输出。

完整代码如下:

def flatten_list(list_in):
    if isinstance(list_in,list):
        for l in list_in:
                for y in flatten_list(l):
                        yield y
    else:
        yield list_in
my_compound_list = [[1,2,3],[4,5,6],[7,8,9,[10,11,12,[13,14,15]]]]
print [f for f in flatten_list(my_compound_list)]

运行以上代码,输出结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]。可以看到,复合列表my_compound_list被成功展开为一个一维列表。

0
0 Comments

Python: 如何循环一个深度不同的列表?

问题的原因是在循环列表的过程中,有些元素是列表,而有些元素不是。为了解决这个问题,可以使用isinstance()函数来检查一个对象是否是列表,然后再深入循环。

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

def myprint(list):
    for i in list:
        if isinstance(i, list):
            myprint(i)
        else:
            print(i)

这段代码首先检查列表中的每个元素,如果元素是列表,则递归调用myprint()函数来循环该子列表;如果元素不是列表,则直接打印该元素。

需要注意的是,这段代码并没有完全回答问题,因为问题并没有很清晰地表达出来。原本应该是一个评论,而不是一个解决方法。但是,通过编辑,作者将其转化为了一个解决方法。

希望这个解决方法对你有帮助!

0
0 Comments

问题:如何循环遍历一个深度不固定的列表?

在上述内容中,提供了两种解决方法。第一种方法是使用递归来解决问题。定义了一个名为rec_sum的函数,该函数接受一个列表作为参数。如果列表为空,则返回0。否则,从列表中获取一个元素,并判断该元素是否为列表。如果是列表,则递归调用rec_sum函数并将结果与剩余列表的元素相加。如果不是列表,则将该元素与剩余列表的元素相加。通过递归的方式,可以解决深度不固定的列表循环遍历问题。

第二种方法是使用递归和for循环的混合解决方案。定义了一个名为rec_for_sum的函数,该函数接受一个列表作为参数。如果列表为空,则返回0。通过for循环遍历列表中的每个元素,如果元素不是列表,则将其加到计数器count上。如果是列表,则递归调用rec_for_sum函数,并将结果加到计数器count上。通过递归和for循环的方式,可以解决深度不固定的列表循环遍历问题,并且限制了递归的层数,避免了堆栈溢出的问题。

需要注意的是,Python对堆栈帧的堆叠有限制,最多只能堆叠1000个堆栈帧。因此,如果列表中的元素超过1000个,可能会引发异常。如果存在可能超过1000个元素的情况,可以使用第二种方法来解决问题。

0