This may not be the most efficient way but I thought to put a one-liner (actually a two-liner). Both versions will work on arbitrary hierarchy nested lists, and exploits language features (Python3.5) and recursion. def make_list_flat(l, flist = []): flist.extend ([l]) if (type (l) is not list) else [make_list_flat (e) for e in l] return flist a = [[1, 2], [[[[3, 4, 5], 6]]], 7, [8, [9, [10, 11], 12, [13, 14, [15, [[16, 17], 18]]]]]] flist = make_list_flat(a) print (flist) The output is [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] This works in a depth first manner. The recursion goes down until it finds a non-list element, then extends the local variable `flist` and then rolls back it to the parent. Whenever `flist` is returned, it is extended to the parent's `flist` in the list comprehension. Therefore, at the root, a flat list is returned. The above one creates several local lists and returns them which are used to extend the parent's list. I think the way around for this may be creating a gloabl `flist`, like below. a = [[1, 2], [[[[3, 4, 5], 6]]], 7, [8, [9, [10, 11], 12, [13, 14, [15, [[16, 17], 18]]]]]] flist = [] def make_list_flat (l): flist.extend ([l]) if (type (l) is not list) else [make_list_flat (e) for e in l] make_list_flat(a) print (flist) The output is again [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] Although I am not sure at this time about the efficiency.