Python: Выравнивание списка списков (4 способа)

В этом учебнике вы узнаете, как использовать Python для сглаживания списка списков! Вы узнаете, как это сделать несколькими разными способами, включая использование циклов for, списковых включений, библиотеки itertools и как сгладить многоуровневые списки списков с помощью, да-да, рекурсии! Давайте посмотрим, что вы узнаете в этом учебнике!

Быстрый ответ: Используйте списковое включение Python для сглаживания списка списков

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

flat_list = [item for sublist in list_of_lists for item in (sublist if isinstance(sublist, list) else [sublist])]

print(flat_list)

# Возвращает: [1, 2, 3, 4, 5, 6, 7, 8, 9]

Оглавление

Что такое список списков в Python?

В Python список списков — это просто список, содержащий другие списки. Фактически, списки списков в Python могут даже содержать другие списки списков! Мы можем сказать, что список, содержащий только один другой уровень списков, называется двумерным списком списков. Когда один или несколько из этих списков содержат другой список, мы говорим, что они называются трехмерными. Это продолжается по мере добавления все больше и больше уровней.

Когда вы преобразуете список списков или двумерный массив в одномерный массив, вы сглаживаете список списков. Узнайте четыре разных способа сделать это в этом учебнике!

Давайте посмотрим на простой список списков в Python, чтобы у вас было визуальное представление о том, как они выглядят:

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

Когда мы пытаемся получить доступ к третьему элементу, позиции индекса 2, мы можем распечатать, что он содержит:

list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(list_of_lists[2])

# Возвращает: [4, 5, 6]

Мы видим здесь, что третий элемент нашего списка list_of_lists на самом деле является другим списком. Это то, что мы имеем в виду под списками списков — это списки, содержащие другие списки.

В следующем разделе вы узнаете, как использовать наивный метод, цикл for, для сглаживания списка списков.

Как использовать цикл for в Python для сглаживания списка списков?

Теперь, когда вы знаете, что такое список списков в Python, давайте посмотрим, как мы можем использовать цикл for в Python для их сглаживания!

В нашем цикле for мы будем проходить по каждому элементу в списке и добавлять каждый элемент в новый список.

Давайте посмотрим, как мы можем этого добиться с помощью Python:

# Используйте цикл for для сглаживания списка списков
list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

flat_list = list()

for sub_list in list_of_lists:
    flat_list += sub_list

print(flat_list)

# Возвращает: [1, 2, 3, 4, 5, 6, 7, 8, 9]

Разберем, что мы сделали здесь пошагово:

  • Мы загрузили наш list_of_lists

  • Мы создали новый список под названием flat_list

  • Мы прошли по каждому элементу или списку в списке списков и добавили значения каждого элемента в наш flat_list

Теперь, когда вы использовали цикл for для сглаживания списка списков, давайте узнаем, как можно использовать списковые включения для их сглаживания!

Как использовать списковое включение в Python для сглаживания списка списков?

Списковые включения в Python — это элегантные, питоновские замены циклам for в Python. Фактически, любое списковое включение можно выразить как цикл for (хотя обратное не обязательно верно).

Так почему же писать списковое включение, когда цикл for может справиться? Существует несколько преимуществ использования списковых включений — давайте быстро рассмотрим их здесь:

  • Вам не нужно создавать новый пустой список

  • Вы можете написать его в одну строку, вместо того чтобы разбивать на несколько строк

  • Они более питоновские, чем циклы for

Давайте посмотрим, как выглядят списковые включения в Python:

Теперь давайте посмотрим, как мы можем использовать списковые включения для сглаживания списков списков в Python:

# Используйте списковое включение для сглаживания списка списков
list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

flat_list = [item for sublist in list_of_lists for item in sublist]

print(flat_list)

# Возвращает: [1, 2, 3, 4, 5, 6, 7, 8, 9]

Имейте в виду, что это делает то же самое, что и цикл for. Синтаксис может потребовать некоторого времени для привыкания, но как только вы его освоите, это станет второй натурой и сэкономит вам много времени!

Как использовать itertools для сглаживания списка списков в Python?

Оба метода, которые мы рассмотрели до сих пор, не требуют импорта другой библиотеки. Теперь давайте посмотрим, как мы можем использовать библиотеку itertools для сглаживания списков списков в Python.

В частности, мы будем использовать функцию chain для прохода по каждому отдельному элементу в большем списке и добавления его в больший список. Наконец, так как функция chain вернет объект itertools.chain, нам нужно преобразовать его обратно в список.

Давайте посмотрим, как это можно сделать:

from itertools import chain

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

flat_list = list(chain(*list_of_lists))

print(flat_list)

# Возвращает: [1, 2, 3, 4, 5, 6, 7, 8, 9]

Так как мы полагаемся на распаковку переменных, не сразу понятно, что происходит в коде (как и в некоторых других пользовательских функциях). Поэтому убедитесь, что вы хорошо документируете свой код!

Как сгладить многоуровневые списки списков в Python?

Теперь может случиться так, что вы столкнетесь с более сложными списками, как показано ниже. Использование одного из этих методов, показанных выше, не сработает, так как они требуют, чтобы уровни внутри их списков были похожими.

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

Мы видим, что в наших списках есть некоторые элементы на корневом уровне и некоторые списки, вложенные в другие списки.

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

Давайте посмотрим, как это можно сделать в Python :

# Сглаживание многоуровневого списка списков с помощью рекурсии
list_of_lists = [1, [2, 3], [4, [5, 6]], [7, 8], 9]

def flatten_list(list_of_lists, flat_list=None):
    if not flat_list:
        flat_list = []
    if not list_of_lists:
        return flat_list
    else:
        for item in list_of_lists:
            if type(item) == list:
                flatten_list(item, flat_list)
            else:
                flat_list.append(item)

    return flat_list

flat_list = flatten_list(list_of_lists)

print(flat_list)

# Возвращает: [1, 2, 3, 4, 5, 6, 7, 8, 9]

Этот пример немного сложнее, давайте посмотрим, что мы сделали здесь:

  • Мы создаем новую функцию flatten_list, которая принимает список списков в качестве входных данных, а также пустой список по умолчанию

  • Мы оцениваем, является ли наш flat_list все еще пустым списком. Если это так, он возвращает себя. В противном случае, мы проходим по каждому элементу и выполняем следующие шаги:

  • Мы проверяем, является ли тип элемента списком:

    • Если это список, то мы снова вызываем функцию

    • Если это не список, мы добавляем элемент в наш flat_list

Мы видим здесь, что это работает довольно просто и на самом деле адаптируется к любому количеству вложений!

Заключение

В этой статье вы узнали, как использовать Python для сглаживания списков списков. Вы также узнали, что такое списки списков в Python. Кроме этого, вы узнали, как использовать циклы for и списковые включения для сглаживания списков списков в Python. Вы также узнали, как использовать библиотеку itertools для сглаживания списков списков. Наконец, вы узнали, как использовать рекурсию для сглаживания многоуровневых списков списков.

Чтобы узнать больше о библиотеке itertools, ознакомьтесь с официальной документацией здесь.

Дополнительные ресурсы

Чтобы узнать больше о связанных темах, ознакомьтесь с учебниками ниже:

Last updated