2023-09-10 12:17:00 +01:00
|
|
|
---
|
|
|
|
tags: [python]
|
|
|
|
---
|
|
|
|
|
|
|
|
# List comprehension
|
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
List comprehension is a syntactic shorthand for applying a function to each
|
|
|
|
element in a list without explicitly using loop syntax.
|
2023-09-10 12:17:00 +01:00
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
Since its introduction to the language, the same functionality has become
|
|
|
|
achievable by using functional methods like
|
2024-02-17 11:57:44 +00:00
|
|
|
[`map` and `filter`](Map_and_filter_in_Python.md),
|
|
|
|
utilising [lambdas](Lambdas_in_Python.md)
|
2024-02-02 15:58:13 +00:00
|
|
|
however list comprehension is often more straightforward and easier to read.
|
2023-09-10 12:17:00 +01:00
|
|
|
|
|
|
|
## Syntax
|
|
|
|
|
|
|
|
Here is a basic example which applies `+ 1` to each integer in a list:
|
|
|
|
|
|
|
|
```python
|
|
|
|
values = [1, 2, 4, 6, 8, 9]
|
|
|
|
|
|
|
|
new_values = [i + 1 for i in values]
|
|
|
|
print('new_values', new_values)
|
|
|
|
# new_values [2, 3, 5, 7, 9, 10]
|
|
|
|
```
|
|
|
|
|
|
|
|
The basic syntax is as follows:
|
|
|
|
|
|
|
|
```
|
|
|
|
new_list = [expression for each member in an iterable]
|
|
|
|
```
|
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
- The _expression_ can be the member itself, a call to a method, or any other
|
|
|
|
valid expression that returns a value. In the example above, the expression
|
|
|
|
`i + i` adds one to each member value.
|
2023-09-10 12:17:00 +01:00
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
- The _member_ is the object or value in the list or iterable. In the example
|
|
|
|
above, the member value is _i_.
|
2023-09-10 12:17:00 +01:00
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
- The _iterable_ is a list, set, dictionary or any other object that can return
|
|
|
|
its elements one at a time. In the example above, the iterable is each value
|
|
|
|
in `values`.
|
2023-09-10 12:17:00 +01:00
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
This is a much more condensed way of achieving the same outcome with a
|
|
|
|
traditional loop:
|
2023-09-10 12:17:00 +01:00
|
|
|
|
|
|
|
```py
|
|
|
|
values = [1, 2, 4, 6, 8, 9]
|
|
|
|
new_list = []
|
|
|
|
for i in values:
|
|
|
|
values.append(i+1)
|
|
|
|
```
|
|
|
|
|
|
|
|
### Another example
|
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
In the following example, we apply list comprehension with a `in range` loop
|
|
|
|
structure:
|
2023-09-10 12:17:00 +01:00
|
|
|
|
|
|
|
```py
|
|
|
|
new_list = [i * i for i in range(10) ]
|
|
|
|
print(new_list)
|
|
|
|
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
### Adding a condition
|
|
|
|
|
2023-09-11 18:39:44 +01:00
|
|
|
We can apply a conditional to a comprehension:
|
2023-09-10 12:17:00 +01:00
|
|
|
|
|
|
|
```py
|
|
|
|
new_list = [item + 1 for item in values if item % 2 == 0]
|
|
|
|
|
|
|
|
print('new_list:', new_list)
|
|
|
|
# new_list: [3, 5, 7, 9]
|
|
|
|
```
|
|
|
|
|
2023-09-11 18:39:44 +01:00
|
|
|
### Filters
|
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
By applying a condition (and no execution to each element) we effectively create
|
|
|
|
a filter:
|
2023-09-11 18:39:44 +01:00
|
|
|
|
|
|
|
```py
|
2023-09-13 07:43:58 +01:00
|
|
|
numbers = [1, 2, 3, 4, 4, 4]
|
2023-09-11 18:39:44 +01:00
|
|
|
numbers_filtered = [i for i in numbers if i > 2]
|
|
|
|
print(numbers_filtered)
|
|
|
|
# [3, 4, 5]
|
|
|
|
```
|
|
|
|
|
|
|
|
For comparison, the same outcome could be achieved with a filter and lambda:
|
|
|
|
|
|
|
|
```py
|
|
|
|
with_filter = list(filter(lambda x: x > 2, numbers))
|
|
|
|
print(with_filter)
|
|
|
|
# [3, 4, 5]
|
|
|
|
```
|
2023-09-10 12:17:00 +01:00
|
|
|
|
2023-09-13 07:43:58 +01:00
|
|
|
## Set comprehension
|
|
|
|
|
2024-02-02 15:58:13 +00:00
|
|
|
We can also apply comprehension to sets. The syntax is practically identical but
|
|
|
|
the difference is the resultant data structure will not contain duplicates.
|
2023-09-13 07:43:58 +01:00
|
|
|
|
|
|
|
```py
|
|
|
|
numbers = [1, 2, 3, 4, 4, 4]
|
|
|
|
unique = {i for i in numbers}
|
|
|
|
print(unique)
|
|
|
|
# {1,2,3,4}
|
|
|
|
```
|
2023-09-10 12:17:00 +01:00
|
|
|
|
|
|
|
## Dictionary comprehension
|
|
|
|
|
2023-09-13 07:43:58 +01:00
|
|
|
```py
|
|
|
|
squares = {i: i * i for i in range(5)}
|
|
|
|
print(squares)
|
|
|
|
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
|
|
|
|
```
|