Разделение списка на равные части в Python: подробное руководство

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

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

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

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

Python
Скопировать код
split = lambda lst, n: [lst[i::n] for i in range(n)]

Для того чтобы использовать функцию split, примените ее следующим образом:

Python
Скопировать код
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
n = 3
print(split(lst, n))  # Результат: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

В итоге мы элегантно формируем подсписки, просто как строительные блоки ЛЕГО.

Кинга Идем в IT: пошаговый план для смены профессии

Точное деление на части

Если точное деление списка на равные части невозможно, наш метод может сформировать подсписки с неодинаковым числом элементов. Для более рационального деления списка следует использоваться вещественное деление и оператор остатка от деления:

Python
Скопировать код
split_precise = lambda lst, n: [lst[round(i*len(lst)/n):round((i+1)*len(lst)/n)] for i in range(n)]

Оператор остатка от деления особенно полезен при распределении элементов, так как он позволяет делить список на части равномернее:

Python
Скопировать код
split_modulo = lambda lst, n: [lst[i*len(lst)//n + min(i, len(lst) % n):(i+1)*len(lst)//n + min(i+1, len(lst) % n)] for i in range(n)]

Работа с числовыми данными

Если вы также увлечены числами, как Шелдон Купер, то для вас будет полезным NumPy. Функция array_split помогает организовать элементы и легко обрабатывает несоразмерное разделение:

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

def split_numpy(lst, n):
    return np.array_split(lst, n)

Демонстрация работы этой функции:

Python
Скопировать код
lst = np.arange(1, 10)
n = 3
print(split_numpy(lst, n))  # Результат: [array([1, 2, 3]), array([4, 5, 6]), array([7, 8, 9])]

Стоя на плечах гигантов

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

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

Представьте, что вы хотите поделить шоколадку на N частей:

Markdown
Скопировать код
Шоколадная плитка (🍫): [🟫🟫🟫🟫🟫🟫🟫🟫🟫🟫🟫🟫]

Разобъём на 3 куска:

Делим как КитКат:

Markdown
Скопировать код
1-я часть (🍫1️⃣): [🟫🟫🟫🟫]
2-я часть (🍫2️⃣): [🟫🟫🟫🟫]
3-я часть (🍫3️⃣): [🟫🟫🟫🟫]

Равномерное распределение гарантирует каждому человеку равное удовольствие от шоколада.

Преодоление типичных проблем

Когда невозможно что-то разделить

Есть вещи, на которые нелегко поделиться, например, Единое Кольцо из "Властелина Колец". В таких случаях оператор модуля волшебным образом поможет вам, обеспечив более справедливое распределение между всеми.

Соблюдение порядка, как в британской очереди

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

Типичные ошибки: Oопа!

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

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

  1. 5. Структуры данных — документация Python 3.5.1 — Официальная документация Python, где рассказывается о работе со списками и структурами данных.
  2. Как разделить список на равные части? – Stack Overflow — Обсуждение методов деления списка, проверенных сообществом программистов.
  3. Справочник API — more-itertools 10.2.0 документация — Разделение на части с помощью функции grouper в библиотеке 'more-itertools'.
  4. numpy.array_split — Руководство NumPy v1.26 — Описание использования функции array_split в NumPy для разделения массивов.
  5. itertools — функции для создания итераторов для эффективного цикла — документация Python 3.5.1 — Набор инструментов Python для создания эффективных итераторов.