2015-10-26 166 views
1

我已经搜索过如何扁平清单列表(即在这里:Making a flat list out of list of lists in Python)但我找到的解决方案没有一个解决列表列表清单的地址只是列表的列表。列表列表清单列表清单

我:

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

我想:

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

该解决方案应该对花车的列表正常工作。有什么建议么?

回答

7

如果我们从this answer应用逻辑,应该不是只是:

In [2]: [[item for subsublist in sublist for item in subsublist] for sublist in my_list] 
Out[2]: [[1, 2, 3, 4, 5], [9, 8, 9, 10, 3, 4, 6], [1]] 

而且,同样通过itertools.chain()

In [3]: [list(itertools.chain(*sublist)) for sublist in my_list] 
Out[3]: [[1, 2, 3, 4, 5], [9, 8, 9, 10, 3, 4, 6], [1]] 
0

您可以使用此递归子程序

def flatten(lst, n): 
    if n == 0: 
    return lst 

    return flatten([j for i in lst for j in i], n - 1) 

mylist = [ [ [1,2,3],[4,5] ], [ [9],[8,9,10],[3,4,6] ], [ [1] ] ] 
flatten(mylist, 1) 
#=> [[1, 2, 3], [4, 5], [9], [8, 9, 10], [3, 4, 6], [1]] 
flatten(mylist, 2) 
#=> [1, 2, 3, 4, 5, 9, 8, 9, 10, 3, 4, 6, 1] 
1

这是一个fl00r的递归答案,里面out版本coinci DES多用什么OP是后:

def flatten(lists,n): 
    if n == 1: 
     return [x for xs in lists for x in xs] 
    else: 
     return [flatten(xs,n-1) for xs in lists] 


>>> flatten(my_list,1) 
[[1, 2, 3], [4, 5], [9], [8, 9, 10], [3, 4, 6], [1]] 
>>> flatten(my_list,2) 
[[1, 2, 3, 4, 5], [9, 8, 9, 10, 3, 4, 6], [1]] 
1

对于这种特殊的情况下,

In [1]: [sum(x,[]) for x in my_list] 
Out[1]: [[1, 2, 3, 4, 5], [9, 8, 9, 10, 3, 4, 6], [1]] 

最短,最快的方法:

In [7]: %timeit [sum(x,[]) for x in my_list] 
100000 loops, best of 3: 5.93 µs per loop