Как разделить список на две части по определенному индексу?
Есть два списка с элементами, в первом множество значений, например — [100,200,1200,1500,2000] , во втором одно значение [2] . Как разделить первый список на две части, что бы в первой части оказались все элементы списка до индекса 2 — (цифра из второго списка) а в другом списке все элементы с индексами >= 2? На входе:
y=[100,200,1200,1500,2000]; z=[2]
y1=[100,200]; y2=[1200,1500,2000]
Разбить список на равные части в Python 3

В этой статье я рассмотрю способы, с помощью которых можно разбить список на части четкого размера на основе пользовательских методов или с помощью встроенных модулей.
Введение
Разбиение строк и списков — это типичная задача программиста. Иногда нам приходится разбивать наши данные особым образом, но чаще — на равные части.
Язык не имеет встроенной функции для этого, и в этом уроке я покажу, как разбить список в Python.
В большинстве случаев это можно сделать с помощью генераторов:
def func(lst, n): for i in range(0, len(lst), n): yield lst[i:i + n]
Хотя есть и другие интересные способы сделать это, каждый со своими плюсами и минусами!
На равные части из n элементов
Список может быть разделен на основе размера определенного фрагмента. Это означает, что мы можем определить размер данной части. Если подмножество списка не вписывается в размер определенного фрагмента, заполнители должны быть вставлены вместо пустых держателей элементов. В этих случаях я буду использовать функцию None.
Давайте создадим новый файл и начнем программирование:
def func_chunk(lst, n): for x in range(0, len(lst), n): e_c = lst[x : n + x] if len(e_c) < n: e_c = e_c + [None for y in range(n - len(e_c))] yield e_c print(list(func_chunk([9, 8, 7, 6, 5, 4, 3, 2, 1], 3)))
Приведенная выше функция func_chunk принимает аргументы: lst для списка и chunk_size для числа, на которое его нужно разделить. Функция выполняет итерацию по списку с приращением размера фрагмента n.
Ожидается, что каждый фрагмент будет иметь размер, заданный в качестве аргумента. Если элементов недостаточно для разделения на один и тот же размер, оставшиеся неиспользуемые элементы заполняются None.
[[9, 8, 7], [6, 5, 4], [3, 2, 1]]
Список был разделен на равные части по 3 элемента в каждой.
Python имеет утилиты для упрощения этого процесса. Мы можем использовать функцию zip_longest из itertools для упрощения предыдущей функции.
Давайте создадим новый файл и напишем следующий код:
from itertools import zip_longest def func_chunk_itertools(lst): i_ = iter(lst) return list(zip_longest(i_, i_, i_, i_)) print(func_chunk_itertools([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]))
Этот код повторяет элементы и возвращает фрагмент желаемой длины на основе предоставленных вами аргументов.
Мы поместили в коде 4 аргументf i_. Функция zip_longest агрегирует и возвращает элементы из каждой итерации. В этом случае она будет агрегировать элементы из списка, который повторяется 4. Затем создается множество итераторов, содержащих 4 последовательных элементов, которые после преобразуются в список и возвращаются.
Вывод программы будет таков:
[(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11), (12, 13, 14, None)]
Эта более короткая функция приводит к тому же выводу программы. Однако этот метод более ограничен, так как нам приходится вручную писать, сколько элементов мы хотим в коде, и немного неудобно просто помещать кучу i_ в вызов zip_longest.
Лучшим решением было бы использование генераторов. Давайте создадим новый файл:
def func_chunks_generators(lst, n): for i in range(0, len(lst), n): yield lst[i : i + n] print( list( func_chunks_generators( [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 54, 3, 2, 2, 1], 4 ) ) )
Этот генератор дает подсписок, содержащий n элементов. В конце концов, это дало бы подсписок для каждой части.
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 8, 7], [6, 54, 3, 2], [2, 1]]
Этот метод работает лучше всего, если вам не нужно заполнение кода с помощью None или иным образом.
На n равных частей
В предыдущем разделе мы разбили список на основе размера отдельных фрагментов так, чтобы каждый фрагмент имел одинаковое количество элементов. Есть и другой способ интерпретировать эту проблему.
Что мы делаем, когда хотим разбить список не по количеству элементов в каждом фрагменте, а по количеству фрагментов, которые мы хотим создать?
Например, вместо того, чтобы разбивать список на части, где каждая часть имеет 7 элементов, мы хотим разбить список на 7 равных частей. В этом случае мы можем не знать размер каждой части.
Логика аналогична предыдущим методам, однако размер части — это предельное значение длины списка, деленное на количество требуемых частей. Как и в предыдущих примерах кода, если в части есть свободные места, они будут заполнены значением None:
import math def func_chunks_num(lst, c_num): n = math.ceil(len(lst) / c_num) for x in range(0, len(lst), n): e_c = lst[x : n + x] if len(e_c) < n: e_c = e_c + [None for y in range(n - len(e_c))] yield e_c print(list(func_chunks_num([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], c_num=3)))
Мы определяем, сколько списков нам нужно создать и сохранить это значение в n. Затем мы создаем подсписок для двух элементов одновременно, заполняя выходные данные в случае, если размер нашего фрагмента меньше желаемой длины.
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, None]]
Как видно из приведенных выше выходных данных, список был разделен на 3 отдельных подспискf равных размеров на основе предоставленного аргумента c_num.
Заключение
В этой статье мы рассмотрели способы, с помощью которых можно разбить список на части равного размера на основе пользовательских методов и с помощью встроенных модулей.
Методы, упомянутые в этой статье, не ограничиваются теми, которые были прописаны здесь, но есть множество других творческих способов, с помощью которых вы также можете разделить свой список на равные части!
Как разделить список на список список списков?
1. Что значит "короче"?
2. Где в вашем примере "список список списков"?
3. По какому принципу вы поделили свой исходный список? И почему вы выбрали именно такой вариант, а не [[1,2,3],[4,5,6]] например?
Woshibai @Woshibai Автор вопроса
dmshar, 1) Как можно более кратко.
2) Может, не так слова подобрал. Но я привел пример, который, надеюсь, понятен.
3) Потому что так надо.
Решения вопроса 1

Руслан Гильфанов @ri_gilfanov
Web- and desktop-developer
l = [1, 2, 3, 4, 5, 6] l = [[l[i], l[j]] for i, j in zip(range(0, len(l) - 1, 2), range(1, len(l), 2))] print(l)
Update. По наводке aRegius о срезах, вариант с zip() можно сократить так:
l = [1, 2, 3, 4, 5, 6] l = [[i, j] for i, j in zip(l[0::2], l[1::2])] print(l)
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
Ответы на вопрос 2

Andrey Dugin @adugin Куратор тега Python
Чуть ли не каждый день этот вопрос задают. Это классический "трюк" на Python, между прочим:
list(zip(*[iter(lst)]*2))
Ответ написан более трёх лет назад
Нравится 3 8 комментариев

Алан Гибизов @phaggi Куратор тега Python
Тааак, это надо осмыслить хорошенько 🙂
У меня вот такое получилось:
[[lst[i], lst[i+1]] for i in range(0,len(lst),2)]
В лоб, так сказать.

Алан Гибизов @phaggi Куратор тега Python
Andrey Dugin, а там унутре вместо списка получается ведь кортеж.
может, так?
list(map(list, list(zip(*[iter(lst)]*2))))
Разбиение списка на равные части в Python
Часто в программировании возникает задача разбить список на равные части. Например, есть список из 10 элементов, и его нужно разбить на части по 2 элемента.
Алексей Кодов
Автор статьи
7 июля 2023 в 17:35
Часто в программировании возникает задача разбить список на равные части. Например, есть список из 10 элементов, и его нужно разбить на части по 2 элемента. В итоге должно получиться 5 подсписков по 2 элемента в каждом.
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
В Python для этого можно использовать различные подходы. Варианты реализации могут варьироваться в зависимости от конкретных требований и условий задачи. Представлены некоторые из них ниже.
Использование цикла for
Один из базовых способов — использование цикла for и встроенной функции range. Сначала задается размер частей, на которые будет разбиваться список, затем с помощью цикла формируются подсписки нужного размера.
chunk_size = 2 chunks = [numbers[i:i + chunk_size] for i in range(0, len(numbers), chunk_size)]
Использование генератора
Можно использовать генераторы, которые позволяют создавать объекты, по которым можно итерироваться, без необходимости сразу создавать все элементы.
def chunks(lst, chunk_size): for i in range(0, len(lst), chunk_size): yield lst[i:i + chunk_size] chunks_list = list(chunks(numbers, chunk_size))
Использование библиотеки Numpy
Если в проекте используется библиотека Numpy, то можно использовать функцию array_split, которая разбивает массив на подмассивы.
import numpy as np chunks = np.array_split(numbers, len(numbers) // chunk_size)
Все эти методы позволяют разбить список на равные части, но выбор конкретного метода зависит от конкретной задачи и условий.