Разбиение списка на части равного размера
Иногда требуется разделить длинный список на несколько мелких списков фиксированного размера — например, для пакетной обработки или вывода данных. В этой статье рассмотрим два подхода: через собственный генератор с yield и через готовую функцию numpy.array_split.
Что нужно знать
Перед изучением примера полезно понимать:
Python: список (list) — работа со списками
Генераторы в Python — генераторы и ключевое слово
yieldPython: цикл for — цикл
forи функцияrange()Python: list comprehension — списковые включения
Пример 1. Разбиение через yield
def split(list_a, chunk_size):
for i in range(0, len(list_a), chunk_size):
yield list_a[i:i + chunk_size]
chunk_size = 2
my_list = [1,2,3,4,5,6,7,8,9]
print(list(split(my_list, chunk_size)))
Вывод
[[1, 2], [3, 4], [5, 6], [7, 8], [9]]
В коде объявлена функция split, которая возвращает части списка по очереди. Цикл for вместе с range() пробегает от 0 до длины списка с шагом, равным размеру части. Срез list_a[i:i + chunk_size] выделяет очередной кусок: при i = 0 берутся элементы с индексами от 0 до 2, на следующем шаге — от 2 до 4 и так далее. Ключевое слово yield превращает функцию в генератор и отдаёт каждую часть по требованию.
Тот же результат можно получить через списковое включение:
chunk_size = 2
list_chunked = [my_list[i:i + chunk_size] for i in range(0, len(my_list), chunk_size)]
print(list_chunked)
Вывод
[[1, 2], [3, 4], [5, 6], [7, 8], [9]]
Пример 2. Разбиение через numpy
import numpy as np
my_list = [1,2,3,4,5,6,7,8,9]
print(np.array_split(my_list, 5))
Вывод
[array([1, 2]), array([3, 4]), array([5, 6]), array([7, 8]), array([9])]
Функция array_split() из библиотеки numpy сама делит список на указанное количество частей примерно равного размера. В нашем случае количество частей — 5. Чтобы этот способ работал, библиотеку numpy нужно предварительно установить (pip install numpy).