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']
Sign in to answer this quiz and track your learning progress
[expression for item in iterable](expression for item in iterable){expression for item in iterable}expression for item in iterableWe 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']
Sign in to answer this quiz and track your learning progress
if condition go in a list comprehension?for keywordfor clauseTo 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'}
Sign in to answer this quiz and track your learning progress
[key: value for item in iterable](key: value for item in iterable){key_expression: value_expression for item in iterable}{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']