Пропустить до содержимого

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

CodeMDD.io

Как привести в порядок список списков в Python

Иногда при работе с данными вы можете столкнуться с ситуацией, когда данные представлены в виде списка вложенных списков. Одной из общих операций является сплющивание (flatten) этого списка, то есть преобразование многомерного списка, такого как матрица, в одномерный список.

Чтобы лучше проиллюстрировать, что такое сплющивание списка, предположим, что у вас есть следующая матрица числовых значений:

Python

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

Переменная matrix содержит список списков в Python. Каждый вложенный список представляет собой строку в матрице. В каждой строке хранятся четыре элемента или числа. Теперь предположим, что вы хотите превратить эту матрицу в следующий список:

Python

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

Каким образом можно сплющить матрицу и получить такой одномерный список, как указано выше? В этом руководстве вы узнаете, как это сделать в Python.

Как сплющить список списков с помощью цикла for

Как можно сплющить список списков в Python? В общем случае для сплющивания списка списков можно выполнить следующие шаги явно или неявно:

  1. Создать новый пустой список, в котором будет храниться сплющенные данные.
  2. Итерироваться по каждому вложенному списку или подсписку в исходном списке.
  3. Добавить каждый элемент из текущего подсписка в список сплющенных данных.
  4. Вернуть конечный список со сплющенными данными.

Продолжая пример с переменной matrix, вот как вы можете преобразовать эти шаги в код на Python, используя цикл for и метод .extend():

Python

def flatten_extend(matrix):
flat_list = []
for row in matrix:
flat_list.extend(row)
return flat_list

Внутри функции flatten_extend() вы сначала создаете новый пустой список с именем flat_list, в котором будет храниться сплющенные данные, когда вы извлечете их из matrix. Затем вы запускаете цикл для итерации по внутренним, или вложенным, спискам из matrix. В этом примере вы используете имя row, чтобы обозначить текущий вложенный список.

На каждой итерации вы используете метод .extend() для добавления содержимого текущего подсписка в flat_list. Этот метод принимает итерируемый объект в качестве аргумента и добавляет его элементы в конец целевого списка.

Теперь выполните следующий код, чтобы проверить, что ваша функция выполняет свою работу:

matrix = [
[9, 3, 8, 3],
[4, 5, 2, 8],
[6, 4, 3, 1],
[1, 0, 4, 5],
]
result = flatten_extend(matrix)
print(result)

Вы должны получить следующий результат:

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

Таким образом, вы успешно сплющили список списков в одномерный список с помощью цикла for и метода .extend().

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

Использование генератора списка для сплющивания списка списков

Генератор списка - это компактный способ создать новый список на основе существующего списка или другого итерируемого объекта. Вы можете использовать генератор списка для сплющивания списка списков в Python.

В Python генератор списка - это выражение в квадратных скобках [], в котором вы можете указать условия, фильтры или действия, которые будут применяться к каждому элементу исходного списка.

Давайте рассмотрим пример использования генератора списка для сплющивания матрицы:

Python

matrix = [
[9, 3, 8, 3],
[4, 5, 2, 8],
[6, 4, 3, 1],
[1, 0, 4, 5],
]
result = [item for sublist in matrix for item in sublist]
print(result)

Вы должны получить тот же результат:

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

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

На каждой итерации вы добавляете элемент item в список result. По сути, генератор списка проходит по каждому элементу исходного списка, выполняя указанное действие и объединяя все результирующие элементы в новый список.

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

Сплющивание списка с использованием стандартной библиотеки и встроенных инструментов

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

Объединение итерируемых объектов с помощью itertools.chain()

Модуль itertools предлагает множество функций для эффективного итерирования и управления итерируемыми объектами в Python. Одной из таких функций является itertools.chain(), которая объединяет несколько итерируемых объектов в один.

Вот как можно использовать itertools.chain() для сплющивания списка списков:

Python

import itertools
matrix = [
[9, 3, 8, 3],
[4, 5, 2, 8],
[6, 4, 3, 1],
[1, 0, 4, 5],
]
result = list(itertools.chain.from_iterable(matrix))
print(result)

В результате вы получите тот же результат:

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

В этом примере вы используете функцию itertools.chain.from_iterable() для объединения итерируемых объектов в matrix. Метод from_iterable() принимает итерируемый объект, который в данном случае является списком списков, и объединяет все его элементы в один плоский итератор. Затем вы преобразуете этот итератор в список с помощью функции list().

Модуль itertools также предлагает другие полезные функции для работы с итерируемыми объектами. Обратитесь к документации Python для получения дополнительной информации о возможностях itertools и примерах их использования.

Конкатенация списков с помощью functools.reduce()

Модуль functools предоставляет различные функции для работы с функциями высшего порядка и другими функциональными конструкциями в Python. Одной из таких функций является functools.reduce(), которая объединяет элементы последовательности в одно значение, используя определенную функцию.

Вот как можно использовать functools.reduce() для сплющивания списка списков:

Python

import functools
matrix = [
[9, 3, 8, 3],
[4, 5, 2, 8],
[6, 4, 3, 1],
[1, 0, 4, 5],
]
result = functools.reduce(lambda a, b: a + b, matrix)
print(result)

Вы также получите тот же результат:

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

В этом примере вы используете функцию functools.reduce() для объединения списков в matrix. Вы передаете лямбда-функцию, которая принимает два аргумента и объединяет их с помощью оператора +. Функция reduce() применяет эту лямбда-функцию к элементам matrix последовательно, пока не получит одно значение - результат объединения. Затем вы получаете список с помощью квадратных скобок.

Модуль functools также предлагает другие функции, такие как functools.partial(), которые могут быть полезны при работе с функциями высшего порядка и создании частичных функций.

Использование sum() для объединения списков

В Python функция sum() используется для суммирования элементов последовательности. Однако вы также можете использовать sum() для объединения списков.

Вот как можно использовать sum() для сплющивания списка списков:

Python

matrix = [
[9, 3, 8, 3],
[4, 5, 2, 8],
[6, 4, 3, 1],
[1, 0, 4, 5],
]
result = sum(matrix, [])
print(result)

Результат будет таким же:

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

В этом примере вы используете функцию sum() для объединения списков в matrix. Вы передаете пустой список [] в качестве начального значения, чтобы избежать ошибки суммирования, которая возникает, когда вы пытаетесь суммировать списки с пустым начальным значением. Функция sum() просматривает элементы matrix последовательно, добавляя их к начальному значению, и возвращает финальное значение - сплющенный список.

Использование sum() для сплющивания списков может быть простым и удобным способом, но он может работать медленнее, особенно для списков большого размера.

Учет производительности при сплющивании списков

При сплющивании списков в Python важно учитывать производительность и выбирать наиболее эффективный способ в зависимости от размера данных и требуемых операций.

Итерация по спискам с использованием цикла for и метода .extend() является наиболее прямым и понятным способом, но он может занять больше времени, особенно для больших списков. Он также требует дополнительной памяти для создания нового списка.

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

Использование стандартной библиотеки и встроенных инструментов, таких как itertools и functools, может предоставить более эффективные и оптимизированные алгоритмы для сплющивания списков.

При работе с большими данными или при использовании сплющивания списков в алгоритмах машинного обучения и анализе данных иногда лучше использовать специализированные библиотеки, такие как NumPy. В следующем разделе вы рассмотрите способ сплющивания списков в Python с использованием NumPy для работы с данными научного исследования.

Сплющивание списков Python для науки о данных с помощью NumPy

NumPy - это мощная библиотека для выполнения математических операций с многомерными массивами и работа с данными в Python. NumPy предоставляет эффективные методы для сплющивания списков, особенно когда речь идет о работе с массивами и матрицами для научных исследований и анализа данных.

Вот как можно использовать NumPy для сплющивания списка списков:

Python

import numpy as np
matrix = [
[9, 3, 8, 3],
[4, 5, 2, 8],
[6, 4, 3, 1],
[1, 0, 4, 5],
]
result = np.array(matrix).flatten().tolist()
print(result)

Вы получите такой же результат:

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

В этом примере вы используете функцию np.array() из библиотеки NumPy для создания массива из списка matrix. Затем вы вызываете метод .flatten(), который преобразует многомерный массив в одномерный. Наконец, вы используете метод .tolist(), чтобы преобразовать одномерный массив обратно в список.

NumPy предлагает множество других методов и функций для манипулирования данными и выполнения операций над массивами. Обратитесь к документации NumPy для получения дополнительной информации о возможностях библиотеки и примерах их использования.

Заключение

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

Выбор конкретного подхода зависит от ваших потребностей и требований производительности. Цикл for и метод .extend() просты и понятны, но могут работать медленнее для больших данных. Генераторы списков предлагают компактный синтаксис, но могут быть сложными для чтения в более сложных случаях.

Стандартная библиотека и встроенные инструменты предоставляют эффективные алгоритмы, особенно для сплющивания списков большого размера. Однако для науки о данных и работы с массивами лучше использовать специализированные библиотеки, такие как NumPy.

Ознакомьтесь с примерами и испытайте разные подходы, чтобы найти тот, который наилучшим образом соответствует вашим потребностям. Удачи в изучении способов сплющивания списков в Python!