Using List Comprehensions Instead of map and filter
Credit: Luther Blissett
Problem
You want to perform an operation on
all the elements of a list, but you’d like to avoid
using map and filter because
they can be hard to read and understand, particularly when they need
lambda.
Solution
Say you want to create a new list by adding 23 to each item of some other list. In Python 1.5.2, the solution is:
thenewlist = map(lambda x: x + 23, theoldlist)
This is hardly the clearest code. Fortunately, since Python 2.0, we can use a list comprehension instead:
thenewlist = [x + 23 for x in theoldlist]
This is much clearer and more elegant.
Similarly, say you want the new list to comprise all items in the other list that are larger than 5. In Python 1.5.2, the solution is:
thenewlist = filter(lambda x: x > 5, theoldlist)
But in modern Python, we can use the following list comprehension:
thenewlist = [x for x in theoldlist if x > 5]
Now say you want to combine both list operations. In Python 1.5.2, the solution is quite complex:
thenewlist = map(lambda x: x+23, filter(lambda x: x>5, theoldlist))
A list comprehension affords far greater clarity, as we can both
perform selection with the if clause and use some
expression, such as adding 23, on the selected items:
thenewlist = [x + 23 for x in theoldlist if x > 5]
Discussion
Elegance and clarity, within a generally pragmatic attitude, are Python’s core values. List comprehensions, added in Python 2.0, delightfully display how pragmatism can enhance both clarity ...