2015-10-26 179 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