关于算法:Python:多级嵌套列表

Python: multilevel nested lists

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Flatten (an irregular) list of lists in Python

例1:

假设我有一个列表:【1,2】,【3,4】】。我可以用两个for循环来打印:1,2,3,4。

例2:

现在假设我得到了一个输出,我不知道列表1中有多少嵌套列表:

列表1=[1,[1,2,[3,5,6,[..],…,]]]

所以,我的问题是,如何才能以与第一个示例相同的格式打印出每个单独的数字。我现在正在处理一个结果是给我嵌套列表的东西,但是函数的不同输入将给我不同数量的嵌套列表。

我能想到的是做这件事,但我不知道在这件事发生后该怎么做:

1
2
3
4
5
6
7
8
c = 0
for i in list1:
   while c < len(list1):
         if isinstance(i, list):

         else:
              print i
         c += 1

谢谢

第一次编辑

如果还有一种方法可以解构所有嵌套列表,使其成为一个对我同样有效的列表,但是我很想知道这两个问题的答案。


ITertools文档中有一些非常好的迭代列表的例子,所以当遇到这样的任务时,它总是一个很好的开始的地方。

我建议使用生成器,这样可以避免创建许多级别的列表:

1
2
3
4
5
6
7
8
def flatten_all(iterable):
    for elem in iterable:
        if not isinstance(elem, list):
            yield elem
        else:
            for x in flatten_all(elem):
                yield x
            # in Python 3.3 just: yield from flatten_all(elem)

应用程序:

1
2
3
4
5
6
for x in flatten_all([1, [2, [3]]]):
    print(x)

# or if you need a list:
my_lst = list(flatten_all([1, [2, [3]]])
assert my_lst == [1, 2, 3]

编辑:非递归线性版本

1
2
3
4
5
6
7
8
9
10
11
def flatten_all(iterable):
    stack = [iter(iterable)]
    while stack:
        try:
            elem  = stack[-1].next()
            if not isinstance(elem, list):
                yield elem
            else:
                stack.append(iter(elem))
        except StopIteration:
            stack.pop()


这是一个使用递归的例子:

1
2
3
4
5
6
7
8
9
10
list1 = [1, [2,3,4], [5, 6, 7, [8, 9]]]

def print_list(l):
    for e in l:
        if type(e) == list:
            print_list(e)
        else:
            print e

print_list(list1)


您可以尝试这样的操作(代码使您的列表平放在一行中,以便稍后打印):

1
2
3
4
5
6
7
8
9
10
11
12
def make_flat(arr):
    res = []
    for l in arr:
        if isinstance(l, list):# or isinstance(l, collections.Iterable)
            res.extend(make_flat(l))
        else:
            res.append(l)
    return res

flat = make_flat(list1)
for x in flat:
    print x

或:

1
2
def make_flat(arr):
    return sum(map(lambda a: make_flat(a) if isinstance(a,(list)) else [a],arr),[])