# Python List comprehensions

> Learn Python list comprehension syntax, including transformations, filters, conditional expressions, and when a loop or generator expression is clearer.

Author: [Flavio Copes](https://flaviocopes.com/about/) | Published: 2021-02-14 | Updated: 2026-07-18 | Topics: [Python](https://flaviocopes.com/tags/python/) | Canonical: https://flaviocopes.com/python-list-comprehensions/

A list comprehension creates a new list from an iterable.

The basic syntax is:

```python
[expression for item in iterable]
```

For example, you can square every number in a list:

```python
numbers = [1, 2, 3, 4, 5]
numbers_squared = [number**2 for number in numbers]

# [1, 4, 9, 16, 25]
```

This is equivalent to:

```python
numbers_squared = []

for number in numbers:
    numbers_squared.append(number**2)
```

It also replaces many simple uses of `map()`:

```python
numbers_squared = list(map(lambda number: number**2, numbers))
```

The comprehension is usually easier to read.

See the official [Python list comprehensions tutorial](https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions) and [language reference](https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries) for the complete rules.

## Filter values

Add an `if` clause after the loop to keep matching values:

```python
numbers = [1, 2, 3, 4, 5]
even_numbers = [number for number in numbers if number % 2 == 0]

# [2, 4]
```

The expression still decides what goes into the new list:

```python
even_numbers_squared = [
    number**2
    for number in numbers
    if number % 2 == 0
]

# [4, 16]
```

## Use a conditional expression

Put a conditional expression before `for` when every input should produce a value:

```python
labels = [
    'even' if number % 2 == 0 else 'odd'
    for number in numbers
]

# ['odd', 'even', 'odd', 'even', 'odd']
```

Notice the difference:

- `if` after `for` filters values out
- `if...else` before `for` transforms every value

## Keep comprehensions readable

List comprehensions are great for a small transformation or filter.

Use a regular loop when the operation needs side effects, several steps, or complicated conditions. Clear code is more important than fitting everything on one line.

A list comprehension creates the whole list immediately. Use a generator expression when you want to produce values lazily:

```python
squares = (number**2 for number in range(1_000_000))
```
