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.