python list comprehensions; compressing a list of lists?

You can have nested iterations in a single list comprehension:

[filename for path in dirs for filename in os.listdir(path)]

which is equivalent (at least functionally) to:

filenames = []
for path in dirs:
    for filename in os.listdir(path):
        filenames.append(filename)

>>> from functools import reduce
>>> listOfLists = [[1, 2],[3, 4, 5], [6]]
>>> reduce(list.__add__, listOfLists)
[1, 2, 3, 4, 5, 6]

I'm guessing the itertools solution is more efficient than this, but this feel very pythonic.

In Python 2 it avoids having to import a library just for the sake of a single list operation (since reduce is a built-in).


You can find a good answer in itertools' recipes:

def flatten(listOfLists):
    return list(chain.from_iterable(listOfLists))

(Note: requires Python 2.6+)