Python Comprehensions

List Comprehensions are a special kind of syntax that let us create lists out of other lists, and are incredibly useful when dealing with numbers and with one or two levels of nested for loops.

From the Python 3 tutorial

List comprehensions provide a concise way to create lists. [...] or to create a subsequence of those elements that satisfy a certain condition.

Read Python Comprehensions: A step by step Introduction for a more in-depth introduction.

List comprehension

This is how we create a new list from an existing collection with a For Loop:

# Traditional approach: create list using a for loop
names = ['Charles', 'Susan', 'Patrick', 'George']

new_list = []
for n in names:
    new_list.append(n)

new_list
['Charles', 'Susan', 'Patrick', 'George']

And this is how we do the same with a List Comprehension:

# List comprehension: concise way to create a new list
# Syntax: [expression for item in iterable]
names = ['Charles', 'Susan', 'Patrick', 'George']

new_list = [n for n in names]  # Create list with all names
new_list
['Charles', 'Susan', 'Patrick', 'George']
Quiz

Sign in to answer this quiz and track your learning progress

What is the basic syntax of a list comprehension?
A. [expression for item in iterable]
B. (expression for item in iterable)
C. {expression for item in iterable}
D. expression for item in iterable

We can do the same with numbers:

# Nested list comprehension: create tuples from two ranges
# Equivalent to nested for loops
n = [(a, b) for a in range(1, 3) for b in range(1, 3)]
n
[(1, 1), (1, 2), (2, 1), (2, 2)]

Adding conditionals

If we want new_list to have only the names that start with C, with a for loop, we would do it like this:

# Traditional approach: filter with if condition
names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']

new_list = []
for n in names:
    if n.startswith('C'):  # Filter names starting with 'C'
        new_list.append(n)

print(new_list)
['Charles', 'Carol']

In a List Comprehension, we add the if statement at the end:

# List comprehension with condition: filter items
# Syntax: [expression for item in iterable if condition]
new_list = [n for n in names if n.startswith('C')]
print(new_list)
['Charles', 'Carol']
Quiz

Sign in to answer this quiz and track your learning progress

Where does the if condition go in a list comprehension?
A. Before the for keyword
B. After the for clause
C. Inside the expression
D. Before the square brackets

To use an if-else statement in a List Comprehension:

# List comprehension with if-else: conditional expression
# Syntax: [expression_if_true if condition else expression_if_false for item in iterable]
nums = [1, 2, 3, 4, 5, 6]
new_list = [num*2 if num % 2 == 0 else num for num in nums]  # Double even numbers
print(new_list)
[1, 4, 3, 8, 5, 12]

Set and Dict comprehensions

The basics of `list` comprehensions also apply to sets and dictionaries.

Set comprehension

# Set comprehension: create a set using comprehension syntax
# Syntax: {expression for item in iterable}
b = {"abc", "def"}
{s.upper() for s in b}  # Convert all strings to uppercase
{"ABC", "DEF"}

Dict comprehension

# Dict comprehension: swap keys and values
# Syntax: {key_expression: value_expression for item in iterable}
c = {'name': 'Pooka', 'age': 5}
{v: k for k, v in c.items()}  # Reverse key-value pairs
{'Pooka': 'name', 5: 'age'}
Quiz

Sign in to answer this quiz and track your learning progress

What syntax is used for dictionary comprehensions?
A. [key: value for item in iterable]
B. (key: value for item in iterable)
C. {key_expression: value_expression for item in iterable}
D. {key, value for item in iterable}

A List comprehension can be generated from a dictionary:

# List comprehension from dictionary: create formatted strings
c = {'name': 'Pooka', 'age': 5}
["{}:{}".format(k.upper(), v) for k, v in c.items()]  # Format as "KEY:value"
['NAME:Pooka', 'AGE:5']