Разделение списка на подсписки в Python: куски по 100 элементов

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы разделить список на подсписки заданной длины, удобно применить листовые включения и операции со срезами. Пример кода: подсписки = [список[i:i + n] for i in range(0, len(список), n)], где список — ваш исходный список, а n — нужный размер подсписков.

Рассмотрим на примере создания подсписков из двух элементов:

Python
Скопировать код
# Создадим исходный список
список = [1, 2, 3, 4, 5]

# Сформируем подсписки
подсписки = [список[i:i + 2] for i in range(0, len(список), 2)]

# Результат: [[1, 2], [3, 4], [5]]
Кинга Идем в IT: пошаговый план для смены профессии

Работаем с подсписками в Python 2.x

Если вы продолжаете использовать Python 2.x, рекомендуется применять xrange() вместо range(), чтобы оптимизировать потребление памяти:

Python
Скопировать код
# Вернёмся в прошлое со списком
список = [1, 2, ..., 500]

# Разобьём список на подсписки
подсписки = [список[i:i + 100] for i in xrange(0, len(список), 100)]

Обработка остатков при разбиении на подсписки

Если длина исходного списка делится на размер подсписков с остатком, собранный остаточный подсписок будет автоматически добавлен в конец:

Python
Скопировать код
# Готовим список
список = [1, 2, ..., 450]

# Разделяем на подсписки
подсписки = [список[i:i + 100] for i in range(0, len(список), 450)]
# Эффективный подход к обработке остатков. Последняя группа: [451, ..., 500]

Разделение на равные части с использованием itertools

Функция itertools.grouper идеально подходит для равномерного разделения списков. Применительно к остаткам, с её помощью они тоже могут быть правильно обработаны:

Python
Скопировать код
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 элементов, а последней выделена особая роль.

Визуализация

Процесс можно сравнить с извлечением морковок из мешка для кормления кроликов:

Markdown
Скопировать код
До: [🥕🥕🥕🥕🥕🥕🥕🥕🥕🥕]

Цель: поделить на 3 подсписка (Кроликам повезло 🐇🐇🐇):

После:
[
  [🥕🥕🥕],  # 🐇
  [🥕🥕🥕],  # 🐇
  [🥕🥕🥕],  # 🐇
  [🥕]       # Оставшаяся морковка!
]

Каждый подсписок обеспечивает порцию для одного кролика.

Повышаем производительность для нетерпеливого программиста

Экономия памяти: Генераторы

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

Python
Скопировать код
# Генерируем большой список
список = [1, 2, ..., 10000]

# Используем генератор для улучшения производительности
подсписки = (список[i:i + 100] for i in range(0, len(список), 100))
# Ваша память в безопасности!

Максимизация скорости: Numpy

При работе с крупными массивами данных ключевое значение имеет производительность. Для её улучшения используйте массивы numpy:

Python
Скопировать код
import numpy as np

# Создаём большой список
список = np.array([1, 2, ..., 10000])

# Используем numpy для увеличения скорости разделения
подсписки = [список[i:i + 100] for i in range(0, len(список), 100)]

Важные предостережения

Проверка размера подсписка

Обязательно убедитесь, что размер подсписка n является положительным числом, чтобы избежать ошибок:

Python
Скопировать код
# Будьте внимательны
def validate_sublist_size(n):
    if n <= 0:
        raise ValueError("Размер подсписка должен быть положительным целым числом")

Обработка неоднородных подсписков

Важно поддерживать баланс при разделении списка. Если итоговые подсписки получаются разной длины, стоит подумать, стоит ли оставлять пустые подсписки:

Python
Скопировать код
# Создаём список
список = [1, 2, ..., 402]

# Разбиваем на подсписки
подсписки = [список[i:i + 100] for i in range(0, len(список), 100)]

# Удаляем пустые подсписки
подсписки = [подсписок for подсписок in подсписки if подсписок]

Полезные материалы

  1. 5. Структуры данных — Документация Python 3.12.2
  2. python – Разбиение списка на меньшие списки (пополам) – Stack Overflow
  3. Cutting and slicing strings in Python – Python Central
  4. Листовые включения в Python – PythonForBeginners.com
  5. slice – Как работает создание срезов в Python – Stack Overflow
  6. itertools — Функции создания итераторов для эффективного циклического обхода — Документация Python 3.12.2
  7. Когда использовать листовые включения в Python – Real Python