Sayan Sayan - 11 months ago 99
Python Question

Convert multi-dimensional list to a 1D list in Python

A multidimensional list like

could be converted to a 1D one by doing
. Can anybody please explain how that happens?

A responder said that this technique could only be used to "flatten" a 2D list -- that it wouldn't work for higher multidimensional lists. But it does, if repeated. For example if A is a 3D-list, then sum(sum(A),[]),[]) will flatten A to a 1D list.

Answer Source

sum adds a sequence together using the + operator. e.g sum([1,2,3]) == 6. The 2nd parameter is an optional start value which defaults to 0. e.g. sum([1,2,3], 10) == 16.

In your example it does [] + [1,2] + [3,4] where + on 2 lists concatenates them together. Therefore the result is [1,2,3,4]

The empty list is required as the 2nd paramter to sum because, as mentioned above, the default is for sum to add to 0 (i.e. 0 + [1,2] + [3,4]) which would result in unsupported operand type(s) for +: 'int' and 'list'

This is the relevant section of the help for sum:

sum(sequence[, start]) -> value

Returns the sum of a sequence of numbers (NOT strings) plus the value of parameter 'start' (which defaults to 0).


As wallacoloo comented this is not a general solution for flattening any multi dimensional list. It just works for a list of 1D lists due to the behavior described above.


For a way to flatten 1 level of nesting see this recipe from the itertools page:

def flatten(listOfLists):
    "Flatten one level of nesting"
    return chain.from_iterable(listOfLists)

To flatten more deeply nested lists (including irregularly nested lists) see the accepted answer to this question (there are also some other questions linked to from that question itself.)

Note that the recipe returns an itertools.chain object (which is iterable) and the other question's answer returns a generator object so you need to wrap either of these in a call to list if you want the full list rather than iterating over it. e.g. list(flatten(my_list_of_lists)).