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

7

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

 a=( [1,2], [2,3,[4,5]] )
 b=( [[1,2],[2,3]] )

我想要循环遍历每个单独的列表。最好的方法是什么?

我不想最终做出这样的事情:

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

1
我确实事先知道它们的深度吗?- 是否缺少“不”? - Tim
1
提示:这种数据结构更合适的名称是树,而不是列表。 - gefei
1
你希望循环针对输入样本执行什么操作? - Martijn Pieters
@Tim,不,我知道它们的深度。 - LarsVegas
@MartijnPieters,我需要确保在将序列传递给函数之前,该序列不包含另一个序列。更重要的是,我需要从最深层级开始将每个序列传递给函数。 - LarsVegas
显示剩余6条评论
4个回答

4

由于您没有定义目的,我正在编写一个函数来对所有元素求和:

def rec_sum(lst):
    if not lst:
        return 0
    el = lst.pop()
    if isinstance(el, list):
        return rec_sum(el) + rec_sum(lst)
    else:
        return el + rec_sum(lst)

即使您事先知道深度,使用递归解决问题更容易。请记住,Python限制了1000个堆栈帧的堆叠。因此,如果您的列表超过1000个项目,则应该会出现异常。如果您认为可能会有超过1000个项目,这里是一种混合解决方案,它使用递归和for循环。它的级别限制为1000,而不是1000个项目。
def rec_for_sum(lst):
    if not lst:
        return 0
    count = 0
    for el in lst:
        if not isinstance(el, list):
            count += el
        else:
            count += rec_for_sum(el)
    return count

1

这并没有回答问题(只要问题能够被理解);它应该是一条评论。 - Martijn Pieters
抱歉,我先前误点击了错误的按钮,但我已经编辑好并提供了解决方案。 - Florian Groetzner

1
您可以使用递归和生成器的组合:
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)]

0

简单的迭代解法(基础不完整):

   for item in your_list:
        if isinstance(item,list):
           ...........
        else:
        ...................

这是你应该走的路。这应该足以让你开始。

递归解决方案:

def list_flatten(my_list):
    for item in my_list:
        if(isinstance(item,list)):
            list_flatten(item)
        else:
            print(item)

这是一个递归解决方案,但要注意内存问题和递归深度。


好的,但是如果数据树的深度达到了10层呢? - LarsVegas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接