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

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

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

  • Как разделить список пополам в Python

  • Как разбить список на части в Python

  • Как разделить список в определённой позиции индекса в Python

  • Как использовать NumPy для разделения списка

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

Содержание


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

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

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

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

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

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

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

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

# Разделение списка на части с использованием генераторов списков

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

NumPy — это мощная библиотека для математических вычислений. Она поддерживает работу с объектами, похожими на списки, называемыми массивами (arrays). Эти массивы оснащены множеством методов для удобной обработки данных.

Примечание: Этот метод работает только с числовыми значениями.

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

  • Преобразовали массивы обратно в списки с помощью генератора списков.

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

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

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


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

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

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

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

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

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

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


Заключение

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


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

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

  • Официальная документация Python: Работа со списками.

  • Книга "Изучаем Python" Марка Лутца: Полный справочник по Python, включая работу с данными.

  • Библиотека NumPy: Официальная документация, особенно раздел, посвящённый функции array_split.

  • Видеоуроки: Канал на YouTube "Corey Schafer" предлагает понятные объяснения работы со списками.

  • Сообщество Stack Overflow: Вопросы по тегу Python для обсуждения сложных сценариев и обмена идеями.

Last updated