In this tutorial, we will explore how to flatten a list of lists in Python. This is a common problem that arises when working with nested data structures.
Introduction to List Comprehensions
Before diving into the solution, let’s take a look at list comprehensions. A list comprehension is a concise way to create a new list from an existing iterable. The general syntax for a list comprehension is:
new_list = [expression for item in iterable]
List comprehensions can also have nested loops, which allows us to iterate over multiple iterables.
Flattening a List of Lists
To flatten a list of lists, we can use a nested list comprehension. The idea is to iterate over each sublist and then iterate over each item in the sublist.
list_of_lists = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
flattened_list = [item for sublist in list_of_lists for item in sublist]
print(flattened_list) # Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]
This code works by iterating over each sublist (sublist
variable) and then iterating over each item in the sublist (item
variable). The for
loops are nested, which allows us to access each item in the sublists.
Using itertools.chain
Another way to flatten a list of lists is to use the itertools.chain
function. This function takes an iterable of iterables and returns a single iterator that yields items from all the sub-iterables.
import itertools
list_of_lists = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
flattened_list = list(itertools.chain(*list_of_lists))
print(flattened_list) # Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Note that the *
operator is used to unpack the list of lists into separate arguments for the chain
function.
Using functools.reduce
We can also use the functools.reduce
function to flatten a list of lists. This function applies a binary function (in this case, concatenation) to all items in an iterable, going from left to right.
import functools
import operator
list_of_lists = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
flattened_list = functools.reduce(operator.concat, list_of_lists)
print(flattened_list) # Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]
This code uses the operator.concat
function to concatenate each sublist.
Performance Comparison
To compare the performance of these methods, we can use the timeit
module.
import timeit
list_of_lists = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
def flatten_list_comprehension():
return [item for sublist in list_of_lists for item in sublist]
def flatten_itertools_chain():
import itertools
return list(itertools.chain(*list_of_lists))
def flatten_functools_reduce():
import functools
import operator
return functools.reduce(operator.concat, list_of_lists)
print(timeit.timeit(flatten_list_comprehension, number=10000))
print(timeit.timeit(flatten_itertools_chain, number=10000))
print(timeit.timeit(flatten_functools_reduce, number=10000))
This code measures the execution time of each method and prints the results.
Conclusion
In conclusion, there are several ways to flatten a list of lists in Python. The choice of method depends on personal preference, performance requirements, and readability considerations. List comprehensions offer a concise and readable solution, while itertools.chain
provides a more functional approach. functools.reduce
can be used for a more imperative style.