> For the complete documentation index, see [llms.txt](https://bemind.gitbook.io/neural/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bemind.gitbook.io/neural/python/python-lists/python-razdelenie-spiska-popolam-na-chasti.md).

# Python: Разделение списка (Пополам, на части)

В этом руководстве вы узнаете, как разбить список в Python, включая способы деления его пополам и на n равных частей. Вы также научитесь разбивать список на части фиксированного размера n, так чтобы каждая часть содержала n элементов (или меньше, если элементов не осталось). Умение работать со списками в Python — важный навык.

К концу этого руководства вы научитесь:

* Как разделить список пополам в Python
* Как разбить список на части в Python
* Как разделить список в определённой позиции индекса в Python
* Как использовать NumPy для разделения списка

**Быстрый ответ:** используйте индексацию списков, чтобы разделить список в Python.

#### Содержание

1. [Как получить доступ к элементам списка по индексу](#kak-poluchit-dostup-k-elementam-spiska-po-indeksu)
2. [Как разделить список пополам](#kak-razdelit-spisok-popolam)
3. [Разделение списка на части с использованием цикла for](#razdelenie-spiska-na-chasti-s-ispolzovaniem-cikla-for)
4. [Разделение списка на части с использованием генераторов списков](#razdelenie-spiska-na-chasti-s-ispolzovaniem-generatorov-spiskov)
5. [Разделение списка с помощью NumPy](#razdelenie-spiska-na-chasti-s-pomoshyu-numpy)
6. [Разделение списка с использованием itertools](#razdelenie-spiska-s-ispolzovaniem-itertools)
7. [Часто задаваемые вопросы](#chasto-zadavaemye-voprosy)
8. [Заключение](#zaklyuchenie)
9. [Дополнительные ресурсы](#dopolnitelnye-resursy)

***

### Как получить доступ к элементам списка по индексу

Одна из полезных особенностей списков в Python — их упорядоченность. Это позволяет получать доступ к элементу или диапазону элементов по индексу. Давайте рассмотрим, как работают индексы списков в Python:

Мы видим, что списки в Python поддерживают как положительные, так и отрицательные индексы. Положительные индексы начинаются с 0, то есть первый элемент списка. Отрицательные индексы начинаются с −1, что позволяет обращаться к последнему элементу списка.

Также можно получать диапазоны элементов с использованием срезов (list slicing). Для этого используется символ ":". Он позволяет выбирать элементы с определённой позиции до определённой позиции.

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

```python
# Разделение списка пополам с помощью срезов

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 для разделения списка на части:

```python
# Разделение списка на части с использованием цикла 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 можно переписать в более лаконичной форме с использованием генераторов списков. Это позволяет сократить код и сделать его более читаемым.

```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

<mark style="color:blue;">**NumPy**</mark> — это мощная библиотека для математических вычислений. Она поддерживает работу с объектами, похожими на списки, называемыми массивами (arrays). Эти массивы оснащены множеством методов для удобной обработки данных.

{% hint style="info" %}
**Примечание:** Этот метод работает только с числовыми значениями.
{% endhint %}

```python
# Разделение списка на части с помощью 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()`, чтобы разделить массив на три части.
* Преобразовали массивы обратно в списки с помощью генератора списков.

Если нужно сделать код короче, можно записать так:

```python
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` позволяет разделять списки или любые другие итерируемые объекты на части.

```python
# Разделение списка с использованием 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 может быть особенно полезным при работе с большими списками, так как позволяет избежать создания временных копий.

***

### Часто задаваемые вопросы

<details>

<summary><strong>Вопрос:</strong> Какой метод лучше всего использовать для больших списков?</summary>

**Ответ:** Для больших списков рекомендуется использовать модуль `itertools`, так как он минимизирует использование памяти и позволяет работать с итерируемыми объектами без создания дополнительных копий.

</details>

<details>

<summary><strong>Вопрос:</strong> Можно ли разделить список строк или объектов?</summary>

&#x20;**Ответ:** Да, описанные методы подходят для списков любого типа данных, включая строки и сложные объекты.

</details>

<details>

<summary><strong>Вопрос:</strong> Как лучше разделить список на неравные части?</summary>

&#x20;**Ответ:** Для неравного деления можно использовать пользовательскую логику в цикле for или библиотеки, такие как NumPy, с указанием конкретных индексов для срезов.

</details>

***

### Заключение

В этом руководстве мы рассмотрели различные способы разделения списков в Python. Вы узнали, как использовать срезы, циклы for, генераторы списков, а также библиотеки NumPy и itertools для этой цели. Эти методы могут быть полезны в зависимости от задачи и объёма данных.

***

### Дополнительные ресурсы

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

* **Официальная документация Python:** [Работа со списками](https://docs.python.org/3/tutorial/datastructures.html#more-on-lists).
* **Книга "Изучаем Python" Марка Лутца:** Полный справочник по Python, включая работу с данными.
* **Библиотека NumPy:** [Официальная документация](https://numpy.org/doc/stable/), особенно раздел, посвящённый функции `array_split`.
* **Видеоуроки:** Канал на YouTube "Corey Schafer" предлагает понятные объяснения работы со списками.
* **Сообщество Stack Overflow:** [Вопросы по тегу Python](https://stackoverflow.com/questions/tagged/python) для обсуждения сложных сценариев и обмена идеями.
