Reputation: 476
As pointed out in comments, most if not all the answers to this related question fail for lists like:
ls = [1,2,[3,4]]
Moreover, the list could be more deeply nested. How to partially flatten up to a user given level (to infinity by default)
ls2 = [1,[2,3],[4,[5,6]]]
Desired output for ls2
:
flatten to level 1:
[1,2,3,4,[5,6]]
flatten to level 2 (or higher)
[1,2,3,4,5,6]
Upvotes: 1
Views: 101
Reputation: 24233
You could do that recursively:
def flatten(l, level=None):
if level == 0:
return l
flattened = []
for item in l:
if isinstance(item, list):
flattened.extend(flatten(item, level-1 if level is not None else None))
else:
flattened.append(item)
return flattened
ls2 = [1,[2,3],[4,[5,6]]]
print(flatten(ls2, level=1))
# [1, 2, 3, 4, [5, 6]]
print(flatten(ls2, level=2))
# [1, 2, 3, 4, 5, 6]
print(flatten(ls2))
# [1, 2, 3, 4, 5, 6]
Upvotes: 1
Reputation: 4199
One way to do it
ls2 = [1,[2,3],[4,[5,6]]]
def make_list_of_list(a):
return [[i]if not isinstance(i, list) else i for i in a]
def flatten(l):
return [item for sublist in make_list_of_list(l) for item in sublist]
flatten(ls2) will result in [1, 2, 3, 4, [5, 6]]
flatten(flatten(ls2)) will result in [1, 2, 3, 4, 5, 6]
Upvotes: 0