Как сгладить список списков в Python

Узнайте, как сгладить список списков в Python. Сравните вложенные списки, itertools.chain, sum и рекурсивные методы с примерами кода.

Попробуйте это решение в редакторе

Обзор

При работе с матричными вычислениями, строками базы данных или анализируемыми деревьями данных вы часто будете сталкиваться с вложенными структурами, такими как список списков: `[[1, 2], [3, 4]]`. Сглаживание этой структуры означает преобразование ее в одномерный список, содержащий все отдельные элементы: `[1, 2, 3, 4]`. Python предлагает несколько элегантных способов добиться этого.

Самый распространенный и питонический способ сгладить список списков — использовать понимание вложенного списка: `[элемент для подсписка в матрице для элемента в подсписке]`. Хотя на первый взгляд синтаксис может показаться немного нелогичным, поскольку циклы написаны в том же порядке, что и вложенный цикл for, он хорошо оптимизирован, быстр и не требует импорта внешних библиотек.

Альтернативно вы можете использовать функцию Chain.from_iterable() модуля `itertools`. Это наиболее эффективный с точки зрения использования памяти подход, поскольку он возвращает итератор, который лениво выдает элементы, а не немедленно выделяет новый список в памяти. Для глубоко вложенных списков (с произвольной глубиной) необходимо написать рекурсивную функцию-генератор для распаковки всех уровней.

Код и вывод выполнения

Этот скрипт демонстрирует выравнивание списка списков с использованием списков, itertools.chain и рекурсивной распаковки.

import itertools

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

# Method 1: List comprehension (Pythonic and fast)
flat_comp = [item for sublist in matrix for item in sublist]
print("List comprehension:", flat_comp)

# Method 2: itertools.chain (Highly memory efficient)
flat_chain = list(itertools.chain.from_iterable(matrix))
print("itertools.chain:", flat_chain)

# Method 3: Recursive function for deep/irregular nesting
irregular = [1, [2, 3], [[4, 5], 6]]

def flatten_deep(items):
    result = []
    for item in items:
        if isinstance(item, list):
            result.extend(flatten_deep(item))
        else:
            result.append(item)
    return result

print("Deep flatten:", flatten_deep(irregular))
Терминальный выход
List comprehension: [1, 2, 3, 4, 5, 6, 7, 8]
itertools.chain: [1, 2, 3, 4, 5, 6, 7, 8]
Deep flatten: [1, 2, 3, 4, 5, 6]

Пошаговая реализация

  • Используйте понимание вложенного списка [элемент для подсписка в вложенном_списке для элемента в подсписке] для плоских 2D-структур.
  • Импортируйте itertools и вызовите itertools.chain.from_iterable(nested_list) для ленивой, удобной для памяти оценки.
  • Определите рекурсивную функцию проверки isinstance(item, list) для обработки произвольно вложенных коллекций.

Часто задаваемые вопросы

Могу ли я использовать функцию sum() для выравнивания списков?

Да, sum(matrix, []) подойдет, но это крайне не рекомендуется. Его сложность составляет O(N^2), поскольку при каждом добавлении создается новая копия списка, что приводит к ужасной производительности для больших наборов данных.

Какой самый быстрый способ сгладить списки списков?

itertools.chain.from_iterable() обычно является самым быстрым, за ним следуют вложенные списки.

Связанные темы

Рекомендуемые ресурсы Python

Расширьте свои знания с помощью соответствующих интерактивных руководств, шпаргалок и сравнений кода.