Search code examples
pythonlist-comprehension

How do I efficiently filter computed values within a Python list comprehension?


The Python list comprehension syntax makes it easy to filter values within a comprehension. For example:

result = [x**2 for x in mylist if type(x) is int]

Will return a list of the squares of integers in mylist. However, what if the test involves some (costly) computation and you want to filter on the result? One option is:

result = [expensive(x) for x in mylist if expensive(x)]

This will result in a list of non-"false" expensive(x) values, however expensive() is called twice for each x. Is there a comprehension syntax that allows you to do this test while only calling expensive once per x?


Solution

  • If the calculations are already nicely bundled into functions, how about using filter and map?

    result = filter (None, map (expensive, mylist))
    

    You can use itertools.imap if the list is very large.