Руководство по выравниванию списков и списков списков в Python

Преобразование 2D-массива в 1D-массив называется выравниванием. Существует множество подходов к решению проблемы.

Мы рассмотрим некоторые из них в этом уроке.

Давайте посмотрим пример.

Вход

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

Выход

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

№1. Петли

Наиболее распространенный способ решения проблемы — использование циклов. Я думаю, что большинство из вас уже поняли это. Давайте посмотрим, как решить проблему с помощью циклов.

  • Инициализируйте список списков с фиктивными данными и назовите его как данные.
  • Теперь инициализируйте пустой список с именем flat_list.
  • Итерация по данным.
    • Распаковать все элементы из текущего списка.
    • Добавьте их в flat_list, используя метод добавления списка.
  • Распечатайте результат.

См. код проблемы ниже.

# initializing the data and an empty list
data = [[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]]
flat_list = []

# iterating over the data
for item in data:
    # appending elements to the flat_list
    flat_list += item

# printing the resultantn flat_list
print(flat_list)

Вы можете использовать другой цикл для добавления элементов подсписка в flat_list вместо оператора конкатенации. Мы также можем использовать списки вместо циклов.

Оба делают одну и ту же работу. Давайте посмотрим следующий способ решения проблемы.

№ 2. Itertools — Сеть

Мы будем использовать метод chain из встроенного модуля itertools.

Цепочка методов перебирает каждый подсписок и возвращает элементы до тех пор, пока в ней не останется подсписков. Он возвращает итерируемый объект, который мы должны преобразовать в список.

Давайте посмотрим на шаги, связанные с решением проблемы.

  • Инициализируйте список списков с фиктивными данными и назовите его как данные.
  • Получите итерацию сглаживания, используя itertools.chain(*data).
  • Преобразуйте полученную итерацию в список.
  • Распечатайте список выравнивания.

Вы можете просмотреть код в приведенном ниже фрагменте.

# importing the module
import itertools

# initializing the data
data = [[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]]

# flattening the list and storing the result
flat_list = itertools.chain(*data)

# converting iterable to list and printing
print(list(flat_list))

№3. Сведение многоуровневых списков

Мы видели, как сгладить список списков. Вышеупомянутые методы, которые мы обсуждали для выравнивания списка, не будут работать для многоуровневых списков. Давайте посмотрим пример.

Вход

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

Выход

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

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

  • Инициализируйте данные, как показано в примере, и назовите их как данные.
  • Инициализируйте пустой список с именем flat_list.
  • Напишите функцию с именем flatten_list.
    • Перебрать элементы заданного списка.
    • Если элемент представляет собой список, то снова рекурсивно вызовите ту же функцию.
    • Если элемент не является списком, добавьте элемент в flat_list.
  • Вызовите функцию с данными.
  • Функция заполнит все элементы в списке flat_list.
  • Распечатайте flat_list, чтобы проверить вывод.

Фу! много шагов для кода. Не волнуйся. Преобразование приведенных выше операторов в код не займет больше минуты.

# initializing the data and empty list
data = [1, [2, 3, [4, 5]], 6, [[7], [8, 9]]]
flat_list = []

# function
def flatten_list(data):
    # iterating over the data
    for element in data:
        # checking for list
        if type(element) == list:
            # calling the same function with current element as new argument
            flatten_list(element)
        else:
            flat_list.append(element)

# flattening the given list
flatten_list(data)

# printing the flat_list
print(flat_list)

Помните, мы не преобразовывали существующий список. Вместо этого мы создали новый список с данным элементом списка.

Вывод

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

Удачного кодирования 🙂