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),[]) |
号