How to make a flat list out of a list of lists
Given a list of lists
flat_list = [item for sublist in t for item in sublist]
flat_list = for sublist in t: for item in sublist: flat_list.append(item)
is faster than the shortcuts posted so far. (
t is the list to flatten.)
Here is the corresponding function:
def flatten(t): return [item for sublist in t for item in sublist]
As evidence, you can use the
timeit module in the standard library:
$ python -mtimeit -s't=[[1,2,3],[4,5,6], , [8,9]]*99' '[item for sublist in t for item in sublist]'10000 loops, best of 3: 143 usec per loop$ python -mtimeit -s't=[[1,2,3],[4,5,6], , [8,9]]*99' 'sum(t, )'1000 loops, best of 3: 969 usec per loop$ python -mtimeit -s't=[[1,2,3],[4,5,6], , [8,9]]*99' 'reduce(lambda x,y: x+y,t)'1000 loops, best of 3: 1.1 msec per loop
Explanation: the shortcuts based on
+ (including the implied use in
sum) are, of necessity,
O(T**2) when there are T sublists -- as the intermediate result list keeps getting longer, at each step a new intermediate result list object gets allocated, and all the items in the previous intermediate result must be copied over (as well as a few new ones added at the end). So, for simplicity and without actual loss of generality, say you have T sublists of k items each: the first k items are copied back and forth T-1 times, the second k items T-2 times, and so on; total number of copies is k times the sum of x for x from 1 to T excluded, i.e.,
k * (T**2)/2.
The list comprehension just generates one list, once, and copies each item over (from its original place of residence to the result list) also exactly once.
You can use
import itertoolslist2d = [[1,2,3], [4,5,6], , [8,9]]merged = list(itertools.chain(*list2d))
merged = list(itertools.chain.from_iterable(list2d))
Note from the author: This is inefficient. But fun, because monoids are awesome. It's not appropriate for production Python code.
1, 2, 3], [4, 5, 6], , [8, 9]]sum(l, )[1, 2, 3, 4, 5, 6, 7, 8, 9]l = [[
This just sums the elements of iterable passed in the first argument, treating second argument as the initial value of the sum (if not given,
0 is used instead and this case will give you an error).
Because you are summing nested lists, you actually get
[1,3]+[2,4] as a result of
sum([[1,3],[2,4]],), which is equal to
Note that only works on lists of lists. For lists of lists of lists, you'll need another solution.