12.7. Comprehension Filter

12.7.1. Recap

>>> result = []
>>>
>>> for x in range(0,5):
...     if x % 2 == 0:
...         result.append(x)
>>>
>>> print(result)
[0, 2, 4]

12.7.2. Syntax

>>> 
... result = [<RETURN> for <VARIABLE> in <ITERABLE> if <CONDITION>]

12.7.3. Example

>>> result = [x for x in range(0,5) if x%2==0]
>>>
>>> print(result)
[0, 2, 4]

12.7.4. Filter list[tuple]

>>> DATA = [
...     ('sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species'),
...     (5.8, 2.7, 5.1, 1.9, 'virginica'),
...     (5.1, 3.5, 1.4, 0.2, 'setosa'),
...     (5.7, 2.8, 4.1, 1.3, 'versicolor'),
...     (6.3, 2.9, 5.6, 1.8, 'virginica'),
...     (6.4, 3.2, 4.5, 1.5, 'versicolor'),
...     (4.7, 3.2, 1.3, 0.2, 'setosa'),
...     (7.0, 3.2, 4.7, 1.4, 'versicolor'),
... ]
>>>
>>>
>>> [row for row in DATA[1:] if row[-1] == 'setosa']
[(5.1, 3.5, 1.4, 0.2, 'setosa'), (4.7, 3.2, 1.3, 0.2, 'setosa')]
>>>
>>> [row[0:4] for row in DATA[1:] if row[-1] == 'setosa']
[(5.1, 3.5, 1.4, 0.2), (4.7, 3.2, 1.3, 0.2)]

12.7.5. Filter list[dict]

>>> users = [
...     {'is_admin': True,  'name': 'Melissa Lewis'},
...     {'is_admin': True,  'name': 'Mark Watney'},
...     {'is_admin': False, 'name': 'Rick Martinez'},
...     {'is_admin': True,  'name': 'Alex Vogel'},
... ]
>>>
>>>
>>> admins = []
>>>
>>> for user in users:
...     if user['is_admin']:
...         admins.append(user['name'])
>>>
>>> print(admins)
['Melissa Lewis', 'Mark Watney', 'Alex Vogel']
>>> users = [
...     {'is_admin': True,  'name': 'Melissa Lewis'},
...     {'is_admin': True,  'name': 'Mark Watney'},
...     {'is_admin': False, 'name': 'Rick Martinez'},
...     {'is_admin': True,  'name': 'Alex Vogel'},
... ]
>>>
>>>
>>> admins = [user['name']
...           for user in users
...           if user['is_admin']]
>>>
>>> print(admins)
['Melissa Lewis', 'Mark Watney', 'Alex Vogel']

12.7.6. Good Practices

>>> result = [pow(x, 2) for x in range(0, 5) if x % 2 == 0]
>>> result = [pow(x,2) for x in range(0,5) if x%2==0]
>>> result = [pow(x,2)
...           for x in range(0,5)
...               if x % 2 == 0]
>>> result = [pow(x,2)
...           for x in range(0,5)
...           if x % 2 == 0]

12.7.7. Assignments

Code 12.7. Solution
"""
* Assignment: Comprehension Filter Even
* Type: class assignment
* Complexity: easy
* Lines of code: 2 lines
* Time: 3 min

English:
    1. Use list comprehension
    2. Generate `result: list[int]`
       of even numbers from 5 to 20 (without 20)
    3. Run doctests - all must succeed

Polish:
    1. Użyj rozwinięcia listowego
    2. Wygeneruj `result: list[int]`
       parzystych liczb z przedziału 5 do 20 (bez 20)
    3. Uruchom doctesty - wszystkie muszą się powieść

Hints:
    * `range()`
    * `%`
    * `==`

Tests:
    >>> import sys; sys.tracebacklimit = 0

    >>> assert type(result) is list, \
    'Result should be a list'

    >>> assert all(type(x) is int for x in result), \
    'Result should be a list of int'

    >>> result
    [6, 8, 10, 12, 14, 16, 18]
"""

# Even numbers from 5 to 20 (without 20)
# type: list[int]
result = ...