How to convert a nested list into a one-dimensional list in Python? How to convert a nested list into a one-dimensional list in Python? python python

How to convert a nested list into a one-dimensional list in Python?


You need to recursively loop over the list and check if an item is iterable(strings are iterable too, but skip them) or not.

itertools.chain will not work for [1,[2,2,2],4] because it requires all of it's items to be iterable, but 1 and 4 (integers) are not iterable. That's why it worked for the second one because it's a list of lists.

>>> from collections import Iterabledef flatten(lis):     for item in lis:         if isinstance(item, Iterable) and not isinstance(item, str):             for x in flatten(item):                 yield x         else:                     yield item>>> lis = [1,[2,2,2],4]>>> list(flatten(lis))[1, 2, 2, 2, 4]>>> list(flatten([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))[1, 2, 3, 4, 5, 6, 7, 8, 9]

Works for any level of nesting:

>>> a = [1,[2,2,[2]],4]>>> list(flatten(a))[1, 2, 2, 2, 4]

Unlike other solutions, this will work for strings as well:

>>> lis = [1,[2,2,2],"456"]>>> list(flatten(lis))[1, 2, 2, 2, '456']


If you're using python < 3 then you can do the following:

from compiler.ast import flattenlist = [1,[2,2,2],4]print flatten(list)

The manual equivalent in python 3.0 would be (taken from this answer):

def flatten(x):    result = []    for el in x:        if hasattr(el, "__iter__") and not isinstance(el, str):            result.extend(flatten(el))        else:            result.append(el)    return result print(flatten(["junk",["nested stuff"],[],[[]]]))  

You could even do the same in a list comprehension:

list = [1,[2,2,2],4]l = [item for sublist in list for item in sublist]

Which is the equivalent of:

l = [[1], [2], [3], [4], [5]]result = []for sublist in l:    for item in sublist:        result.append(item)print(result)


To Make A Single list from a Nested List in python we can simply do this :

from functools import reducesome_list = [[14], [215, 383, 87], [298], [374], [2,3,4,5,6,7]]single_list = reduce(lambda x,y: x+y, some_list)print(single_list)

Output:[14, 215, 383, 87, 298, 374, 2, 3, 4, 5, 6, 7]