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): 
                ...
4

4 回答 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
于 2013-11-11T15:25:59.907 回答
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)]
于 2013-11-11T14:51:22.787 回答
1

您可以检查一个对象是否是一个列表,然后再深入:

另请参阅如何检查对象是列表还是元组(但不是字符串)?

def myprint(list):
    for i in list:
        if isinstance(i, list):
            myprint(i)
        else:
            print i
于 2013-11-11T13:56:20.747 回答
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)

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

于 2013-11-11T14:00:58.740 回答