Python: Разделение списка (Пополам, на части)
В этом руководстве вы узнаете, как разбить список в Python, включая способы деления его пополам и на n равных частей. Вы также научитесь разбивать список на части фиксированного размера n, так чтобы каждая часть содержала n элементов (или меньше, если элементов не осталось). Умение работать со списками в Python — важный навык.
К концу этого руководства вы научитесь:
Как разделить список пополам в Python
Как разбить список на части в Python
Как разделить список в определённой позиции индекса в Python
Как использовать NumPy для разделения списка
Быстрый ответ: используйте индексацию списков, чтобы разделить список в Python.
Содержание
Как получить доступ к элементам списка по индексу
Одна из полезных особенностей списков в Python — их упорядоченность. Это позволяет получать доступ к элементу или диапазону элементов по индексу. Давайте рассмотрим, как работают индексы списков в Python:
Мы видим, что списки в Python поддерживают как положительные, так и отрицательные индексы. Положительные индексы начинаются с 0, то есть первый элемент списка. Отрицательные индексы начинаются с −1, что позволяет обращаться к последнему элементу списка.
Также можно получать диапазоны элементов с использованием срезов (list slicing). Для этого используется символ ":". Он позволяет выбирать элементы с определённой позиции до определённой позиции.
Вы можете легко разделить список пополам с помощью срезов. Как вы узнали выше, срезы позволяют выбирать несколько элементов. Давайте посмотрим, как это работает:
# Разделение списка пополам с помощью срезов
a_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
half_length = len(a_list) // 2
first_half, second_half = a_list[:half_length], a_list[half_length:]
print(f'{first_half=}')
print(f'{second_half=}')
# Вывод:
# first_half=[1, 2, 3, 4, 5]
# second_half=[6, 7, 8, 9, 10]
Разбор кода:
Мы создали список
a_list
, который содержит 10 элементов.Затем мы создали переменную
half_length
, равную длине списка, делённой пополам с использованием целочисленного деления.Далее мы присвоили переменным
first_half
иsecond_half
значения, полученные с помощью срезов списка до и после значенияhalf_length
.
Как разделить список пополам
Разделение списка пополам в Python может быть выполнено с использованием срезов, как показано в предыдущем разделе. Этот метод является наиболее удобным и быстрым способом выполнения задачи.
Разделение списка на части с использованием цикла for
Циклы for — чрезвычайно полезный инструмент в Python. Они делают реализацию многих методов понятной и простой. Посмотрим, как использовать цикл for для разделения списка на части:
# Разделение списка на части с использованием цикла for
a_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
chunked_list = list()
chunk_size = 3
for i in range(0, len(a_list), chunk_size):
chunked_list.append(a_list[i:i+chunk_size])
print(chunked_list)
# Вывод: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11]]
Разбор кода:
Мы создали два списка:
a_list
, содержащий исходные элементы, и пустой списокchunked_list
.Объявили переменную
chunk_size
, равную 3, чтобы указать размер частей.Прошлись по элементам списка с использованием функции
range
. В данном случае,range
создаёт последовательность от 0 до длины списка с шагом, равным размеру части (chunk_size
). Например,range(0, 11, 3)
создаёт последовательность [0, 3, 6, 9].В каждой итерации цикла мы добавляем элементы в
chunked_list
, используя срезыa_list[i:i+chunk_size]
.
Разделение списка на части с использованием генераторов списков
Во многих случаях циклы for в Python можно переписать в более лаконичной форме с использованием генераторов списков. Это позволяет сократить код и сделать его более читаемым.
# Разделение списка на части с использованием генераторов списков
our_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
chunk_size = 3
chunked_list = [our_list[i:i+chunk_size] for i in range(0, len(our_list), chunk_size)]
print(chunked_list)
# Вывод: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11]]
Разбор кода:
Мы объявили переменную
chunk_size
для определения размера частей.Генератор списка создаёт подсписки с использованием тех же принципов, что и в цикле for, но записывается в одну строку.
Этот подход немного быстрее в написании, но вопрос о его читаемости остаётся открытым. В следующем разделе мы рассмотрим использование NumPy для разделения списка на части.
Разделение списка на части с помощью NumPy
NumPy — это мощная библиотека для математических вычислений. Она поддерживает работу с объектами, похожими на списки, называемыми массивами (arrays). Эти массивы оснащены множеством методов для удобной обработки данных.
# Разделение списка на части с помощью NumPy
import numpy as np
a_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
our_array = np.array(a_list)
chunked_arrays = np.array_split(our_array, 3)
chunked_list = [list(array) for array in chunked_arrays]
print(chunked_list)
# Вывод: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Разбор кода:
Мы преобразовали список в массив NumPy с использованием
np.array()
.Использовали функцию
np.array_split()
, чтобы разделить массив на три части.Преобразовали массивы обратно в списки с помощью генератора списков.
Если нужно сделать код короче, можно записать так:
chunked_list = [list(array) for array in np.array_split(np.array(a_list), 3)]
print(chunked_list)
# Вывод: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Разделение списка с использованием itertools
Модуль itertools предоставляет полезные функции для обработки итераций. Функция itertools.islice
позволяет разделять списки или любые другие итерируемые объекты на части.
# Разделение списка с использованием itertools
from itertools import islice
def chunk_with_itertools(iterable, chunk_size):
iterable = iter(iterable)
return iter(lambda: list(islice(iterable, chunk_size)), [])
our_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
chunked_list = list(chunk_with_itertools(our_list, 3))
print(chunked_list)
# Вывод: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
Разбор кода:
Мы импортировали функцию
islice
из модуляitertools
.Функция
chunk_with_itertools
создаёт итератор для входного списка и возвращает части с указанным размеромchunk_size
.Функция
lambda
создаёт подсписки, пока в исходном списке остаются элементы.Итератор преобразуется в список с помощью
list()
для вывода результата.
Использование itertools может быть особенно полезным при работе с большими списками, так как позволяет избежать создания временных копий.
Часто задаваемые вопросы
Заключение
В этом руководстве мы рассмотрели различные способы разделения списков в Python. Вы узнали, как использовать срезы, циклы for, генераторы списков, а также библиотеки NumPy и itertools для этой цели. Эти методы могут быть полезны в зависимости от задачи и объёма данных.
Дополнительные ресурсы
Для более глубокого изучения методов обработки списков в Python, рекомендуем следующие ресурсы:
Официальная документация Python: Работа со списками.
Книга "Изучаем Python" Марка Лутца: Полный справочник по Python, включая работу с данными.
Библиотека NumPy: Официальная документация, особенно раздел, посвящённый функции
array_split
.Видеоуроки: Канал на YouTube "Corey Schafer" предлагает понятные объяснения работы со списками.
Сообщество Stack Overflow: Вопросы по тегу Python для обсуждения сложных сценариев и обмена идеями.
Last updated