2015-10-26 5 views
1

Я уже искал SO для того, чтобы сгладить список списков (то есть здесь: 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, совпадающая дез более с тем, что после того, как ОП был:

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 
Смежные вопросы