guys. I'm trying to find the most elegant solution to a problem and wondered if python has anything built-in for what I'm trying to do.
What I'm doing is this. I have a list, A
, and I have a function f
which takes an item and returns a list. I can use a list comprehension to convert everything in A
like so;
[f(a) for a in A]
But this return a list of lists;
[a1,a2,a3] => [[b11,b12],[b21,b22],[b31,b32]]
What I really want is to get the flattened list;
[b11,b12,b21,b22,b31,b32]
Now, other languages have it; it's traditionally called flatmap
in functional programming languages, and .Net calls it SelectMany
. Does python have anything similar? Is there a neat way to map a function over a list and flatten the result?
The actual problem I'm trying to solve is this; starting with a list of directories, find all the subdirectories. so;
import os
dirs = ["c:\\usr", "c:\\temp"]
subs = [os.listdir(d) for d in dirs]
print subs
currentliy gives me a list-of-lists, but I really want a list.
The question proposed
flatmap
. Some implementations are proposed but they may unnecessary creating intermediate lists. Here is one implementation that's base on iterators.In Python 2.x, use
itertools.map
in place ofmap
.(but Ants's answer is better; +1 for him)
You could try
itertools.chain()
, like this:itertools.chain()
returns an iterator, hence the passing tolist()
.Google brought me next solution:
You can use pyxtension: