Flatten a Nested List

problem-solving
Published

May 16, 2024

Flattening a nested list—that is, converting a list containing lists (or even lists within lists within lists!) into a single-level list—is a common task in Python programming. This post explores several effective methods to achieve this, ranging from simple loops to more sophisticated techniques using list comprehensions and the itertools module.

Method 1: Using Nested Loops

The most straightforward approach uses nested loops. This is easy to understand, especially for beginners, but can become less efficient with deeply nested lists.

nested_list = [[1, 2, 3], [4, [5, 6]], 7]
flat_list = []

for sublist in nested_list:
    if isinstance(sublist, list):
        for item in sublist:
            flat_list.append(item)
    else:
        flat_list.append(sublist)

print(flat_list)  # Output: [1, 2, 3, 4, 5, 6, 7]

This code iterates through the outer list. If an element is itself a list, it iterates through that sublist, appending each item to flat_list. Otherwise, it appends the element directly. Note the use of isinstance() to check the type of each element.

Method 2: Recursion

For arbitrarily deep nested lists, recursion provides a more elegant solution. A recursive function calls itself until it reaches the base case (a non-list element).

def flatten(nested_list):
    flat_list = []
    for item in nested_list:
        if isinstance(item, list):
            flat_list.extend(flatten(item))  # Recursive call
        else:
            flat_list.append(item)
    return flat_list

nested_list = [[1, 2, [3, 4]], [5, [6, [7, 8]]]]
flat_list = flatten(nested_list)
print(flat_list)  # Output: [1, 2, 3, 4, 5, 6, 7, 8]

This recursive function handles nested lists of any depth. The extend() method is used to efficiently add all items from the flattened sublist.

Method 3: List Comprehension (for simpler cases)

For less complex nested lists, a list comprehension offers a concise and Pythonic solution. However, it becomes less readable and maintainable for deeply nested structures.

nested_list = [[1, 2, 3], [4, 5, 6]]
flat_list = [item for sublist in nested_list for item in sublist]
print(flat_list)  # Output: [1, 2, 3, 4, 5, 6]

Method 4: Using itertools.chain.from_iterable

The itertools module provides efficient tools for working with iterators. chain.from_iterable elegantly flattens a list of iterables.

from itertools import chain

nested_list = [[1, 2, 3], [4, 5, 6]]
flat_list = list(chain.from_iterable(nested_list))
print(flat_list)  # Output: [1, 2, 3, 4, 5, 6]

This method is particularly efficient for large lists because it avoids the overhead of repeated appends. It efficiently handles only one level of nesting though. For deeper nesting, you would need to combine it with recursion or another flattening technique.

Choosing the Right Method

The best method depends on the complexity of your nested list and your priorities (readability, efficiency, conciseness). For simple cases, list comprehensions are concise. For deeply nested lists or for optimal performance with large datasets, recursion or itertools.chain.from_iterable (in conjunction with recursion for deep nesting) are preferable. The nested loop approach is a good starting point for understanding the underlying logic.