Python List Comprehension Tutorial

Anastasios Antoniadis

Below is an expert-level overview of Python list comprehensions. This article will help you understand how to create and manipulate Python lists efficiently using concise syntax, explore how list comprehensions replace traditional for loops or lambda-based functions, and demonstrate how to nest or conditionally refine comprehensions. By the end, you will be able to tackle problems like flattening a matrix, filtering columns, or transforming large sequences using short and readable one-line expressions.

1. Introduction

When performing data science tasks, you frequently process complex data structures, such as lists of lists (e.g., matrices), or large collections of data that you need to filter, transform, or aggregate. Python offers several ways to accomplish such tasks: Traditional for loops, lambda functions with built-in functions like map(), filter(), and reduce(), and list comprehensions.

Among these options, list comprehensions often stand out for their concise and readable syntax, making them a go-to tool for transforming and filtering data quickly. This tutorial will walk you through:

  1. A brief review of Python lists and how they work.
  2. A deep dive into list comprehensions, including their mathematical roots.
  3. How to enhance list comprehensions with conditionals (if, else) and handle multiple conditions.
  4. Nested list comprehensions to handle multi-dimensional data structures.

Ready to improve your Python data manipulation game? Let’s begin!

2. Python Lists in a Nutshell

You may have already experimented with storing different data types in separate variables, where each variable holds a single value. However, in data science, you often deal with numerous data points, making it impractical to manage each value in its own variable. A more efficient approach is to use lists.

Lists belong to Python’s four built-in data structures, alongside tuples, dictionaries, and sets. Unlike basic data types like int or bool, a list is a compound data type, meaning it can contain multiple values in one container—even if those values differ in type (booleans, strings, integers, or even other lists).

Additionally, lists are ordered collections, categorized in Python as “sequence types.” Like strings or tuples, this ordering means you can iterate through their elements in a predictable sequence.

To create a list in Python, place your elements between square brackets ([]) and separate them with commas; then, assign this collection to a variable. Since lists can hold any data type (including other lists), they offer a highly flexible way to manage complex sets of information.

In a nutshell, lists are an essential Python data structure. They:

  • Are ordered collections (sequence types), which means each element has a definite index.
  • Are mutable, so you can add, remove, or update elements in place.
  • Can hold mixed data types simultaneously (integers, floats, strings, even other lists).
  • You create a list using square brackets ([]) and separate elements with commas:
# Example of a Python list
example_list = [1, "hello", 3.14, True, [2, 4, 6]]

Because lists behave like sequences, you can loop over them, slice them, and more. This flexibility underpins the power of list comprehensions.

3. Introduction to List Comprehensions

3.1 Basic Syntax

A list comprehension follows a simple formula:

new_list = [expression for item in iterable]
  1. expression – The transformation or operation applied to each element of the iterable.
  2. item – A variable name representing elements from the iterable.
  3. iterable – A sequence or collection (such as a list, range, or tuple).

3.2 The Mathematical Connection

The concept of list comprehensions mirrors the set-builder notation in mathematics, where you define a set (or list) by describing its elements using a rule. For instance:

  • S = { x² : x in {0 … 9} }
  • M = { x : x in S and x even }

Translated into Python list comprehensions:

S = [x**2 for x in range(10)]  # 0, 1, 4, 9, ..., 81
M = [x for x in S if x % 2 == 0]

This “formula-like” syntax is at the heart of list comprehensions in Python.

4. List Comprehensions vs. Other Python Constructs

4.1 For Loops

Traditional approach:

numbers = range(10)
new_list = []

for n in numbers:
    if n % 2 == 0:
        new_list.append(n**2)

print(new_list)  
# [0, 4, 16, 36, 64]

List comprehension approach:

numbers = range(10)
new_list = [n**2 for n in numbers if n % 2 == 0]
print(new_list)
# [0, 4, 16, 36, 64]

The list comprehension is more compact and can often be faster. Using the timeit module typically demonstrates that list comprehensions outperform equivalent for-loop constructs.

4.2 Lambda Functions with map() and filter()

map() + lambda

# Converting kilometers to feet
kilometer = [39.2, 36.5, 37.3, 37.8]
feet_map = map(lambda x: float(3280.8399)*x, kilometer)
print(list(feet_map))
# [128608.92408000001, 119750.65635, 122375.32826999998, 124015.74822]

Rewrite with a list comprehension:

feet_comp = [float(3280.8399)*x for x in kilometer]
print(feet_comp)
# [128608.92408000001, 119750.65635, 122375.32826999998, 124015.74822]

filter() + lambda

# Filter out odd/even, for example
feet = [128608, 119750, 122375, 124015]
uneven = filter(lambda x: x % 2, feet)
print(list(uneven))
# [122375, 124015]

Rewrite with list comprehension:

uneven_comp = [x for x in feet if x % 2]
print(uneven_comp)
# [122375, 124015]

reduce() + lambda

from functools import reduce

# Sum all elements in feet
total = reduce(lambda x, y: x + y, feet)
print(total)
# 494748


Rewrite approach:
Since list comprehensions only handle one item variable at a time, you typically use an aggregating function like sum():

total_alt = sum(x for x in feet)
print(total_alt)
# 494748

5. Adding Conditionals in List Comprehensions

5.1 Single If Condition

You can embed a single if condition:

feet = [128608, 119750, 122375, 124015]
even_half = [x/2 for x in feet if x % 2 == 0]
print(even_half)
# [64304.0, 59875.0]

Which is equivalent to a more verbose for-loop:

even_half_loop = []
for x in feet:
    if x % 2 == 0:
        even_half_loop.append(x/2)

5.2 Multiple If Conditions

Chaining multiple conditions is equally straightforward:

divided = [x for x in range(100) if x % 2 == 0 if x % 6 == 0]
print(divided)
# [0, 6, 12, 18, 24, 30, ..., 96]

5.3 If-Else Conditions

Add else to create more complex expressions:

result = [x + 1 if x >= 120000 else x + 5 for x in feet]
print(result)
# [128609, 119755, 122376, 124016]

Under the hood, that equates to:

new_result = []
for x in feet:
    if x >= 120000:
        new_result.append(x + 1)
    else:
        new_result.append(x + 5)

6. Nested List Comprehensions

Working with lists of lists (like matrices) often calls for nested comprehensions.

6.1 Flattening a List of Lists

list_of_list = [[1,2,3],[4,5,6],[7,8]]
flattened = [item for sublist in list_of_list for item in sublist]
print(flattened)
# [1, 2, 3, 4, 5, 6, 7, 8]

Here, you have two for clauses, reflecting the nested structure:

  1. for sublist in list_of_list
  2. for item in sublist

6.2 Transposing a Matrix

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

transposed = [[row[i] for row in matrix] for i in range(3)]
print(transposed)
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

This transforms the matrix by switching rows and columns.

6.3 Creating a Matrix with Nested Comprehensions

matrix_zeros = [[0 for col in range(4)] for row in range(3)]
print(matrix_zeros)
# [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

You’re basically saying: for each of 3 rows, build a list of 4 zeros.

7. Conclusion and Further Steps

Congratulations! You now have a solid foundation in Python list comprehensions, a powerful tool for concise, readable, and often faster data manipulations. Some key takeaways:

  • Syntax: [expression for item in iterable (if condition)]
  • Conditionals: if, multiple ifs, and if-else can shape your final list’s content.
  • Nested Comprehensions: Perfect for flattening multi-dimensional lists or constructing matrices.
  • Replacing map(), filter(), reduce(): List comprehensions often handle these tasks more elegantly.

Beyond Lists

Python also supports dictionary, set, and generator comprehensions, all of which follow a similar idea but operate on different types of collections. You can continue exploring these to bolster your data manipulation skills further.

Frequently Asked Questions (FAQs)

  1. What is list comprehension in Python?
    It’s a concise way to create lists from iterables by applying an expression or filter to each element.
  2. When should I use list comprehension?
    Whenever you need a quick transformation of an iterable—especially for straightforward mapping or filtering tasks.
  3. How do I add conditional logic to list comprehensions?
    Simply include if condition within the brackets. For example: [x for x in iterable if x > 0].
  4. Can I flatten a list of lists with a single comprehension?
    Yes: [item for sublist in list_of_lists for item in sublist].
  5. What about rewriting reduce() calls?
    Because reduce() deals with two items at once (x and y), you can often replace it with built-in functions like sum() in combination with a comprehension or generator expression.
  6. Are list comprehensions always the best choice?
    They are succinct and fast for many tasks, but code clarity matters. If a comprehension is too complex (multiple nested loops and conditions), a more explicit loop might be clearer.
Anastasios Antoniadis
Find me on
Latest posts by Anastasios Antoniadis (see all)

Leave a Comment