
Problem –
You have a list and you want to filter the element of this list based on some criteria.
In [1]: nums = [ 1, 7, -4, -2, 5, -10, 8, -9]
Here, we have some numbers and we want to get the positive or negative integers from this list.
Solution –
List Comprehensions –
The easiest way to filter a list is using list comprehension.
In [2]: pos = [n for n in nums if n > 0]
In [3]: pos
Out[3]: [1, 7, 5, 8]
In [4]: neg = [n for n in nums if n < 0]
In [5]: neg
Out[5]: [-4, -2, -10, -9]
Sometimes, you may want to replace the value that does not satisfy a condition with something else. You can also accomplish this using list comprehensions. Let’s replace negative values with zeros.
In [6]: pos = [n if n> 0 else 0 for n in nums]
In [7]: pos
Out[7]: [1, 7, 0, 0, 5, 0, 8, 0]
Generators –
List comprehension is OK if the list is not big enough and if the list is massive that you may not want to use list comprehension as it will create a massive list. In this situation you can use generators in python.
In [8]: pos = (n for n in nums if n > 0)
In [9]: pos
Out[9]: <generator object <genexpr> at 0x0000022980AC3C48>
In [10]: for i in pos:
...: print(i)
...:
1
7
5
8
Filter –
Another way to filter data from lists is using filter in python. To filter data, you have to first create a function that apply the filtering logic then you have to apply filter.
In [12]: nums = [1, 7, -4, '?', 'N/A', 8, -9]
In [13]: def is_pos(val):
...: try:
...: if val > 0:
...: return True
...: except TypeError:
...: return False
...:
In [14]: pos = list(filter(is_pos, nums))
In [15]: pos
Out[15]: [1, 7, 8]