List comprehension in Python is an easy to read, compact, and elegant way of creating a list from any existing iterable object. It offers a concise syntax for building new lists based on the values within an existing sequence or other iterable.
Essentially, it's a simpler and often more efficient way to create a new list by iterating over elements of a list or another iterable object and applying an expression to each element. As noted by the reference, it is generally a single line of code enclosed in square brackets ([]
).
How List Comprehension Works
The basic structure of a list comprehension is designed to be intuitive:
[expression for item in iterable]
This reads almost like plain English: "create a list containing the result of expression
for each item
in the iterable
."
You can also include conditional logic to filter elements:
[expression for item in iterable if condition]
This means "create a list containing the result of expression
for each item
in the iterable
, but only if the condition
is true for that item."
Why Use List Comprehensions?
Developers often prefer list comprehensions over traditional for
loops with .append()
for several reasons:
- Readability: For simple transformations and filtering, the concise nature of list comprehensions makes the code easier to understand at a glance.
- Conciseness: They reduce the amount of code needed compared to a multi-line loop structure.
- Performance: List comprehensions can often be slightly faster than equivalent
for
loops because they are optimized internally in Python. - Elegance: Many find the syntax more "Pythonic" and aesthetically pleasing.
Practical Examples
Let's look at a few examples to see list comprehensions in action.
-
Creating a list of squared numbers:
numbers = [1, 2, 3, 4, 5] # Using list comprehension squared_numbers = [x**2 for x in numbers] # Result: [1, 4, 9, 16, 25]
Compare this to the traditional
for
loop approach:numbers = [1, 2, 3, 4, 5] squared_numbers_loop = [] for x in numbers: squared_numbers_loop.append(x**2) # Result: [1, 4, 9, 16, 25]
The comprehension is shorter and directly expresses the intent.
-
Filtering a list:
all_numbers = [10, 15, 20, 25, 30] # Using list comprehension to get even numbers even_numbers = [num for num in all_numbers if num % 2 == 0] # Result: [10, 20, 30]
-
Combining transformation and filtering:
words = ["apple", "banana", "cherry", "date"] # Get the length of words longer than 5 characters long_word_lengths = [len(word) for word in words if len(word) > 5] # Result: [6, 6] (lengths of "banana" and "cherry")
-
Nested list comprehensions (for nested loops):
# Creating a flat list from a list of lists matrix = [[1, 2], [3, 4], [5, 6]] flat_list = [num for row in matrix for num in row] # Result: [1, 2, 3, 4, 5, 6]
Comparison: List Comprehension vs. For Loop
Feature | List Comprehension | Traditional For Loop |
---|---|---|
Syntax | Compact, single line ([...] ) |
Multi-line (for ...: ) |
Readability | Often clearer for simple cases | More explicit for complex logic |
Conciseness | More concise | More verbose |
Performance | Can be slightly faster | Generally comparable, depends on complexity |
Return | Always returns a new list | Requires manual list creation and .append() |
When to Use List Comprehensions
Use list comprehensions when:
- You need to create a new list based on an existing iterable.
- The logic involves a single
for
loop, potentially with one or twoif
conditions. - The transformation or filtering logic is relatively simple.
Avoid using list comprehensions when:
- The logic inside the loop is complex or involves side effects (like printing, modifying external variables).
- Multiple nested loops make the comprehension hard to read (more than two levels deep).
- Readability is compromised by trying to cram too much logic into a single line.
List comprehensions are a powerful and widely used feature in Python, making code cleaner and more efficient for list creation tasks.