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

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

CodeMDD.io

Как развернуть список списков в Python

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

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

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

Переменная matrix содержит список 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():

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]

Вы должны увидеть, что функция flatten_extend() успешно разворачивает список списков.

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

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

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

def flatten_generator(matrix):
return [item for sublist in matrix for item in sublist]

Вы можете заметить, что код становится более компактным и выразительным. В этой реализации вы создаете новый список с помощью генераторного выражения. Генераторное выражение item for sublist in matrix for item in sublist создает новый список, перебирая вложенные списки в matrix и добавляя каждый элемент из вложенного списка в создаваемый список.

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

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

Вывод:

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

Вы снова увидите, что функция выполняет разворачивание списка списков.

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

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

Цепочка итерируемых объектов с помощью itertools.chain()

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

import itertools
def flatten_chain(matrix):
return list(itertools.chain(*matrix))

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

Давайте проверим, что функция разворачивает список списков:

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

Вывод:

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

Функция flatten_chain() разворачивает список списков.

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

Модуль functools в стандартной библиотеке предоставляет функцию reduce(), которая позволяет применять функцию к двум элементам списка, а затем к результату и следующему элементу. Вы можете использовать reduce() в сочетании с оператором конкатенации (+) для развертывания списка списков:

import functools
def flatten_reduce(matrix):
return functools.reduce(lambda x, y: x + y, matrix)

В этой реализации вы импортируете модуль functools и затем используете функцию reduce(). Функция lambda x, y: x + y принимает два аргумента x и y и просто конкатенирует их. Затем вы применяете reduce() к matrix, что приводит к последовательной конкатенации всех вложенных списков.

Давайте проверим, что функция разворачивает список списков:

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

Вывод:

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

Функция flatten_reduce() разворачивает список списков.

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

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

def flatten_sum(matrix):
return sum(matrix, [])

В этой реализации вы просто вызываете sum() со списком matrix и пустым списком [] в качестве начальной суммы. sum() применяет операцию сложения к элементам matrix и начальной сумме, и возвращает результирующий список.

Давайте проверим, что функция разворачивает список списков:

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

Вывод:

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

Функция flatten_sum() разворачивает список списков.

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

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

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

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

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

Вот как вы можете использовать NumPy для разворачивания списка списков:

import numpy as np
def flatten_numpy(matrix):
return np.ravel(matrix).tolist()

В этой реализации вы импортируете библиотеку NumPy как np. Затем вы используете функцию ravel() из NumPy для разворачивания списка списков. Функция ravel() возвращает одномерный массив NumPy. Затем вы преобразуете массив NumPy обратно в список с помощью tolist().

Давайте проверим, что функция разворачивает список списков:

matrix = np.array([
[9, 3, 8, 3],
[4, 5, 2, 8],
[6, 4, 3, 1],
[1, 0, 4, 5],
])
result = flatten_numpy(matrix)
print(result)

Вывод:

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

Функция flatten_numpy() разворачивает список списков с использованием библиотеки NumPy.

Заключение

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

Теперь у вас есть знания и инструменты, чтобы успешно развернуть список списков в Python в любом случае использования.