Flatten an irregular list of lists Flatten an irregular list of lists python python

Flatten an irregular list of lists


Using generator functions can make your example a little easier to read and probably boost the performance.

Python 2

def flatten(l):    for el in l:        if isinstance(el, collections.Iterable) and not isinstance(el, basestring):            for sub in flatten(el):                yield sub        else:            yield el

I used the Iterable ABC added in 2.6.

Python 3

In Python 3, the basestring is no more, but you can use a tuple of str and bytes to get the same effect there.

The yield from operator returns an item from a generator one at a time. This syntax for delegating to a subgenerator was added in 3.3

from collections.abc import Iterabledef flatten(l):    for el in l:        if isinstance(el, Iterable) and not isinstance(el, (str, bytes)):            yield from flatten(el)        else:            yield el


My solution:

import collectionsdef flatten(x):    if isinstance(x, collections.Iterable):        return [a for i in x for a in flatten(i)]    else:        return [x]

A little more concise, but pretty much the same.


Generator using recursion and duck typing (updated for Python 3):

def flatten(L):    for item in L:        try:            yield from flatten(item)        except TypeError:            yield itemlist(flatten([[[1, 2, 3], [4, 5]], 6]))>>>[1, 2, 3, 4, 5, 6]