Well in some cases it really is more efficient.
[func(x) if x in collection if cond(x)]
makes a single pass over the data and gives you a list, but list(map(func, filter(cond, collection)))
makes two passes and requires some extra function calls.I think the real reason is perceived legibility on the part of the Python core devs. I seem to recall a document from a while ago in which GvR himself came out in favor of list comprehension style. "Explicit is better than implicit".