Разделение списка на подсписки в Python: куски по 100 элементов
Быстрый ответ
Чтобы разделить список на подсписки заданной длины, удобно применить листовые включения и операции со срезами. Пример кода: подсписки = [список[i:i + n] for i in range(0, len(список), n)]
, где список
— ваш исходный список, а n
— нужный размер подсписков.
Рассмотрим на примере создания подсписков из двух элементов:
# Создадим исходный список
список = [1, 2, 3, 4, 5]
# Сформируем подсписки
подсписки = [список[i:i + 2] for i in range(0, len(список), 2)]
# Результат: [[1, 2], [3, 4], [5]]
Работаем с подсписками в Python 2.x
Если вы продолжаете использовать Python 2.x, рекомендуется применять xrange()
вместо range()
, чтобы оптимизировать потребление памяти:
# Вернёмся в прошлое со списком
список = [1, 2, ..., 500]
# Разобьём список на подсписки
подсписки = [список[i:i + 100] for i in xrange(0, len(список), 100)]
Обработка остатков при разбиении на подсписки
Если длина исходного списка делится на размер подсписков с остатком, собранный остаточный подсписок будет автоматически добавлен в конец:
# Готовим список
список = [1, 2, ..., 450]
# Разделяем на подсписки
подсписки = [список[i:i + 100] for i in range(0, len(список), 450)]
# Эффективный подход к обработке остатков. Последняя группа: [451, ..., 500]
Разделение на равные части с использованием itertools
Функция itertools.grouper
идеально подходит для равномерного разделения списков. Применительно к остаткам, с её помощью они тоже могут быть правильно обработаны:
from itertools import zip_longest
# Планируем разделение со 'grouper'
def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
# Генерируем список
список = [1, 2, ..., 500]
# Разделяем на подсписки
подсписки = list(grouper(список, 100, fillvalue=None))
# Подсписки по 100 элементов, а последней выделена особая роль.
Визуализация
Процесс можно сравнить с извлечением морковок из мешка для кормления кроликов:
До: [🥕🥕🥕🥕🥕🥕🥕🥕🥕🥕]
Цель: поделить на 3 подсписка (Кроликам повезло 🐇🐇🐇):
После:
[
[🥕🥕🥕], # 🐇
[🥕🥕🥕], # 🐇
[🥕🥕🥕], # 🐇
[🥕] # Оставшаяся морковка!
]
Каждый подсписок обеспечивает порцию для одного кролика.
Повышаем производительность для нетерпеливого программиста
Экономия памяти: Генераторы
Большие списки могут вызвать проблемы с памятью. Используйте генераторы, чтобы экономить память, создавая подсписки при необходимости:
# Генерируем большой список
список = [1, 2, ..., 10000]
# Используем генератор для улучшения производительности
подсписки = (список[i:i + 100] for i in range(0, len(список), 100))
# Ваша память в безопасности!
Максимизация скорости: Numpy
При работе с крупными массивами данных ключевое значение имеет производительность. Для её улучшения используйте массивы numpy:
import numpy as np
# Создаём большой список
список = np.array([1, 2, ..., 10000])
# Используем numpy для увеличения скорости разделения
подсписки = [список[i:i + 100] for i in range(0, len(список), 100)]
Важные предостережения
Проверка размера подсписка
Обязательно убедитесь, что размер подсписка n
является положительным числом, чтобы избежать ошибок:
# Будьте внимательны
def validate_sublist_size(n):
if n <= 0:
raise ValueError("Размер подсписка должен быть положительным целым числом")
Обработка неоднородных подсписков
Важно поддерживать баланс при разделении списка. Если итоговые подсписки получаются разной длины, стоит подумать, стоит ли оставлять пустые подсписки:
# Создаём список
список = [1, 2, ..., 402]
# Разбиваем на подсписки
подсписки = [список[i:i + 100] for i in range(0, len(список), 100)]
# Удаляем пустые подсписки
подсписки = [подсписок for подсписок in подсписки if подсписок]
Полезные материалы
- 5. Структуры данных — Документация Python 3.12.2
- python – Разбиение списка на меньшие списки (пополам) – Stack Overflow
- Cutting and slicing strings in Python – Python Central
- Листовые включения в Python – PythonForBeginners.com
- slice – Как работает создание срезов в Python – Stack Overflow
- itertools — Функции создания итераторов для эффективного циклического обхода — Документация Python 3.12.2
- Когда использовать листовые включения в Python – Real Python