Iterate each iterable, flatten all elements, then recast the iterable to a list. Here are two approaches:
Given
iterables = (
('1', (('2355', '5'), 'F')),
('1', (('2300', '4'), 'M')),
('1', (('2400', '5'), 'F'))
)
expected = [
['1','2355','5','F'],
['1','2300','4','M'],
['1','2400','5','F']
]
Code
A modified flatten
from this post (Python 2/3 compatible):
# Approach 1
from collections import Iterable
def flatten(items):
"""Yield items from any nested iterable"""
for x in items:
if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
for i in flatten(x):
yield i
else:
yield x
actual = [list(flatten(i)) for i in iterables]
assert actual == expected
For a one-liner, consider more_itertools.collapse
, a tool that also flattens nested iterables:
# Approach 2
import more_itertools as mit
actual = [list(mit.collapse(i)) for i in iterables]
assert actual == expected
Note: more_itertools
is a third-party library that implements several itertools recipes and useful tools. Install by pip install more_itertools
.