Yes, I know this subject has been covered before:
- Python idiom to chain (flatten) an infinite iterable of finite iterables?
- Flattening a shallow list in Python
- Comprehension for flattening a sequence of sequences?
- How do I make a flat list out of a list of lists?
but as far as I know, all solutions, except for one, fail on a list like [[[1, 2, 3], [4, 5]], 6], where the desired output is [1, 2, 3, 4, 5, 6] (or perhaps even better, an iterator).
The only solution I saw that works for an arbitrary nesting is found in this question:
def flatten(x):
result = []
for el in x:
if hasattr(el, "__iter__") and not isinstance(el, basestring):
result.extend(flatten(el))
else:
result.append(el)
return result
Is this the best approach? Did I overlook something? Any problems?
Using generator functions can make your example easier to read and improve performance.
Python 2
Using the
IterableABC added in 2.6:Python 3
In Python 3,
basestringis no more, but the tuple(str, bytes)gives the same effect. Also, theyield fromoperator returns an item from a generator one at a time.