How to convert a nested list into a one-dimensional list in Python?
If you're using python < 3
then you can do the following:
from compiler.ast import flatten
list = [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)
from nltk import flatten
example_list = [1, [2, 3], 3]
flattened_list = flatten(example_list)
print(flattened_list)
Output: [1, 2, 3, 3]
To Make A Single list from a Nested List in python we can simply do this :
from functools import reduce
some_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]
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 Iterable
def 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']