Гид по технологиям

Как преобразовать вложенный список Python в плоский

4 min read Python Обновлено 02 Jan 2026
Преобразовать вложенный список Python
Преобразовать вложенный список Python

Блоки кода в редакторе кода

Вложенный список — это список, элементы которого сами могут быть списками или другими итерируемыми объектами. Если вы собрали данные из разных источников, результат может выглядеть как список списков или как смесь списков, кортежей, множеств и словарей. Часто удобнее привести такую структуру к одномерному списку — плоскому списку.

В этой статье показаны три подхода и дополнительные рекомендации: когда каждый метод применим, когда он не подойдёт и как выбрать оптимальный вариант.

Как выпрямить список: обзор методов

Кратко о вариантах:

  • sum() — простой синтаксис для списка списков, но есть нюансы производительности.
  • Цикл for / list comprehension — универсально для разных итерируемых типов.
  • itertools.chain и рекурсия — для произвольной глубины вложенности или больших наборов.

Способ 1: sum() для списка списков

Если у вас именно список списков (то есть каждый элемент — список), можно воспользоваться конструкцией с sum(). Это приёмо читаем и требует одной строки:

nestedList = [[1, 3, 4], [2, 4], [7, 9, 0]]

flatList = sum(nestedList, [])
print(flatList)

# Output: [1, 3, 4, 2, 4, 7, 9, 0]

Важно: sum() работает только для одинаковых типов, которые поддерживают конкатенацию, например списков. Он не применим к словарям, множествам или объектам, которые нельзя складывать.

Замечание по производительности: суммирование списков последовательно создаёт новые списки, что может приводить к избыточным копированиям при большом объёме данных. Для небольших наборов этот метод удобен и читабелен.

Способ 2: цикл for и list comprehension для смешанных типов

Если элементы вложенного списка могут быть не только списками, но и кортежами, множествами или словарями (например, вы хотите итерировать по ключам словаря), безопаснее распаковать через цикл или генератор:

nestedList = [[1, 3, 4], (1, 5, 6), {1, 2, 4}, {'e': 3, 'o': 9, 't': 7}]
flatList = []

for i in nestedList:
    for k in i:
        flatList.append(k)

print(flatList)

# Output: [1, 3, 4, 1, 5, 6, 1, 2, 4, 'e', 'o', 't']

То же можно записать короче с помощью list comprehension:

flatList = [k for i in nestedList for k in i]

print(flatList)

# Output: [1, 3, 4, 1, 5, 6, 1, 2, 4, 'e', 'o', 't']

Этот подход прост, предсказуем и работает с любыми итерируемыми объектами. Однако он предполагает ровень вложенности 1 (список, элементы которого — итерируемые). Для глубокой многослойной вложенности нужен другой подход.

Альтернативы и продвинутые подходы

  1. itertools.chain — эффективен и читаем для списка итерируемых объектов:
import itertools

nestedList = [[1, 3, 4], (1, 5, 6), {1, 2, 4}]
flatList = list(itertools.chain.from_iterable(nestedList))
print(flatList)

# Output: [1, 3, 4, 1, 5, 6, 1, 2, 4]
  1. Рекурсивная функция — когда вложенность произвольной глубины и вы хотите полностью распаковать все уровни:
def flatten_recursive(seq):
    flat = []
    for item in seq:
        if isinstance(item, (list, tuple, set)):
            flat.extend(flatten_recursive(item))
        elif isinstance(item, dict):
            flat.extend(item.keys())
        else:
            flat.append(item)
    return flat

nested = [1, [2, (3, 4), [5, [6]]], {'a': 7, 'b': 8}]
print(flatten_recursive(nested))

# Possible output: [1, 2, 3, 4, 5, 6, 'a', 'b']

Примечание: при рекурсии следите за глубиной вложенности, чтобы не столкнуться с RecursionError при экстремальных данных.

Когда методы не подходят и типичные ошибки

  • Если структура содержит неоднородные объекты, которые не являются итерируемыми (например, числа, None, объекты классов), простой двойной цикл выдаст ошибку при попытке итерироваться.
  • sum() нельзя применять к словарям и множествам.
  • При желании «сплющить» словарь часто нужно выбирать, что именно вы хотите получить: ключи, значения или пары.
  • Рекурсия может быть медленнее и требует контроля глубины; для очень больших наборов лучше использовать итеративные генераторы.

Критерии приёмки

  • Все элементы целевого результата присутствуют и их порядок соответствует определённым требованиям (если порядок важен).
  • Отсутствуют дублирование или, наоборот, неумышленная потеря элементов (особенно при работе с множествами или словарями).
  • Производительность соответствует ожиданиям для объёма данных: время и память в допустимых пределах.

Как выбрать метод — простая эвристика

  • Если структура — список списков и данные небольшие: sum().
  • Если элементы — разные итерируемые объекты и нужна простота: цикл for или list comprehension.
  • Если данные большие и важна производительность: itertools.chain.
  • Если вложенность произвольной глубины и требуется полная распаковка: рекурсия или специализированный итератор.

Короткий глоссарий

  • Вложенный список — список, элементами которого являются сами списки или другие итерируемые объекты.
  • Итерируемый объект — объект, по которому можно пройти в цикле for (list, tuple, set, dict и т.д.).
  • Конкатенация — объединение последовательностей (например, списков) в одну.

Важно: всегда учитывайте семантику данных. Иногда «сплющивание» нежелательно, если вы теряете смысловую связь между элементами.

Итоги

  • Для простых случаев выбирайте читаемость: sum() или list comprehension.
  • Для производительности и гибкости рассмотрите itertools.chain.
  • Для глубокой вложенности применяйте рекурсию или итеративные алгоритмы с контролем стека.

Сохраните критерии приёмки и тестовый набор входных данных, чтобы убедиться, что выбранный метод корректно работает с вашими данными.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Отключение PCA в Windows
Windows

Отключение PCA в Windows

Проблемы при обновлении до Windows 7 — решения
Windows

Проблемы при обновлении до Windows 7 — решения

Переустановка Windows 7 без потери настроек
Windows

Переустановка Windows 7 без потери настроек

Windows 10 приложение для Arduino — пошагово
Разработка

Windows 10 приложение для Arduino — пошагово

4×4×4 LED‑куб на Arduino — полное руководство
Электроника

4×4×4 LED‑куб на Arduino — полное руководство

Санта в Alexa: как включить и что спросить
Умный дом

Санта в Alexa: как включить и что спросить