Как разделить список на части python
Перейти к содержимому

Как разделить список на части python

  • автор:

Разбить список на несколько по условию

Добрый день, друзья. Помогите решить задачу. Есть два условных списка, один с элементами, другой с повторяющимися числами. Нужно список элементов разбить на совокупность списков в зависимости от повторяющихся чисел

27.04.2018 в 11:32 #7987 Score: 1

Karma: 472 pts

уже было, но вот еще раз:

27.04.2018 в 12:13 #7991 Score: 0

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

1. Что значит «короче»?
2. Где в вашем примере «список список списков»?
3. По какому принципу вы поделили свой исходный список? И почему вы выбрали именно такой вариант, а не [[1,2,3],[4,5,6]] например?

Woshibai @Woshibai Автор вопроса

dmshar, 1) Как можно более кратко.
2) Может, не так слова подобрал. Но я привел пример, который, надеюсь, понятен.
3) Потому что так надо.

Решения вопроса 1

ri_gilfanov

Руслан Гильфанов @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

adugin

Andrey Dugin @adugin Куратор тега Python

Чуть ли не каждый день этот вопрос задают. Это классический «трюк» на Python, между прочим:
list(zip(*[iter(lst)]*2))

Ответ написан более трёх лет назад
Нравится 3 8 комментариев

phaggi

Алан Гибизов @phaggi Куратор тега Python

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

phaggi

Алан Гибизов @phaggi Куратор тега Python

Andrey Dugin, а там унутре вместо списка получается ведь кортеж.
может, так?
list(map(list, list(zip(*[iter(lst)]*2))))

python разделить список на равные группы

Это легко проверяемо. Берём рандомного питониста и просим его написать — wait, oh shi-, значит нет.

Навскидку, проверять лень:

[l for _, l in groupby(enumerate(a), lambda a: a[0] // 4)] 

t184256 ★★★★★
( 01.06.20 12:19:40 MSK )

Функциональное решение через свёртку

>>> from functools import reduce >>> input = list(range(14)) >>> reduce(lambda xss, x: xss[:-1] + [xss[-1] + [x]] if len(xss[-1]) < 4 else xss + [[x]], input, [[]]) [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13]] 

Crocodoom ★★★★★
( 01.06.20 13:06:54 MSK )
anonymous
( 01.06.20 13:23:02 MSK )
Ответ на: комментарий от vvn_black 01.06.20 12:15:32 MSK

простой, очевидный, быстронабираемый

WitcherGeralt ★★
( 01.06.20 13:23:56 MSK )
Ответ на: комментарий от anonymous 01.06.20 13:23:02 MSK

Тьфу, не туда посмотрел.

anonymous
( 01.06.20 13:24:07 MSK )
Ответ на: комментарий от WitcherGeralt 01.06.20 13:23:56 MSK
vvn_black ★★★★★
( 01.06.20 13:25:11 MSK )
Ответ на: комментарий от vvn_black 01.06.20 13:25:11 MSK

Ага, самое близкое к дефолтному. Меня этот пост слегка огорчил, когда я понял, что стандартного способа нет.

WitcherGeralt ★★
( 01.06.20 13:26:45 MSK )
Ответ на: комментарий от WitcherGeralt 01.06.20 13:26:45 MSK

надо бросать всё и срочно делать python 4

buratino ★★★★★
( 01.06.20 13:32:16 MSK ) автор топика
Ответ на: комментарий от WitcherGeralt 01.06.20 13:26:45 MSK

Меня этот пост слегка огорчил, когда я понял, что стандартного способа нет.

Так это же везде делается через слайсы. Или нет?

vvn_black ★★★★★
( 01.06.20 13:35:51 MSK )

ОТнаследовать list и перегрузить в нем операцию div, сразу появится

AntonI ★★★★
( 01.06.20 13:39:50 MSK )
Ответ на: комментарий от vvn_black 01.06.20 13:35:51 MSK

Слайсы слайсами, а какой-нибудь хелпер в itertools мог бы и найтись.

WitcherGeralt ★★
( 01.06.20 14:32:03 MSK )
Ответ на: комментарий от AntonI 01.06.20 13:39:50 MSK

перегрузить в нем операцию div, сразу появится

Хорошая идея, только лучше mod , так как от list / 2 ожидаешь всё-таки деления списка пополам

Crocodoom ★★★★★
( 01.06.20 14:32:40 MSK )
Ответ на: комментарий от Crocodoom 01.06.20 14:32:40 MSK

Ну от mod можно ожидать получение среза с хвоста…

Давно пора сделать ЯП куда можно вводить свои операции;-)

AntonI ★★★★
( 01.06.20 14:54:36 MSK )
Ответ на: комментарий от Crocodoom 01.06.20 14:32:40 MSK

перегрузить в нем операцию div, сразу появится

Хорошая идея, только лучше mod, так как от list / 2 ожидаешь всё-таки деления списка пополам

Готового способа нет именно поэтому.

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

blexey ★★★★★
( 01.06.20 14:56:52 MSK )
Ответ на: комментарий от AntonI 01.06.20 14:54:36 MSK

Давно пора сделать ЯП куда можно вводить свои операции;-)

Но зачем еще один Forth?

blexey ★★★★★
( 01.06.20 15:01:41 MSK )
anonymous
( 01.06.20 15:51:48 MSK )
qulinxao3 ★
( 06.06.20 12:22:11 MSK )

def parting(inp,d): o,c=[],[] for z in inp: c.append(z); if len(c)==d: o.append(c) c=[] else: if c: o.append(c) return o def jojo(ll): return [''.join(l) for l in ll] print(jojo(parting('abcdef1234',4)),file=__import__('sys').stdout) 

parting - он конечно в лоб и линейно без всяких лист компиренсив - но вот прям простой, очевидный, быстронабираемый и быстрозапоминаемый

qulinxao3 ★
( 06.06.20 12:47:16 MSK )
qulinxao3 ★
( 07.06.20 19:26:23 MSK )
Ответ на: комментарий от qulinxao3 06.06.20 12:22:11 MSK

порфирьевич

а вот что будет, если посты qulinxao скормить порфирьевичу #порфирьевич ?

развлекался пару дней, скармливая коллекцию мицголизмов порфирьевичу – невозбранно достигнув желаемого.

хотя там простые марковские цепи. и вроде память не очень длинная.

anonymous
( 11.06.20 02:48:45 MSK )
Ответ на: порфирьевич от anonymous 11.06.20 02:48:45 MSK

сообщай итоги (и промежуточные тож)

qulinxao3 ★
( 11.06.20 10:50:52 MSK )
Ответ на: комментарий от qulinxao3 11.06.20 10:50:52 MSK
anonymous
( 11.06.20 15:31:40 MSK )
Ответ на: комментарий от qulinxao3 11.06.20 10:50:52 MSK

философическое

anonymous
( 11.06.20 15:45:41 MSK )
Ответ на: комментарий от qulinxao3 11.06.20 10:50:52 MSK
anonymous
( 11.06.20 16:01:39 MSK )
Ответ на: комментарий от qulinxao3 11.06.20 10:50:52 MSK
anonymous
( 11.06.20 16:26:16 MSK )
Ответ на: комментарий от anonymous 11.06.20 16:26:16 MSK

ещё 20 лет назад такое делали 🙂

buratino ★★★★★
( 11.06.20 16:34:22 MSK ) автор топика
Ответ на: комментарий от qulinxao3 11.06.20 10:50:52 MSK
anonymous
( 11.06.20 16:42:13 MSK )
Ответ на: комментарий от buratino 11.06.20 16:34:22 MSK

вот это да! многобукав. и не уломает же писать 🙂 а есть начальники которые примерно так и могут задвинуть.

мощно. внушаить. и ниачом 🙂

anonymous
( 11.06.20 16:46:15 MSK )

rupert ★★★★★
( 11.06.20 16:52:58 MSK )
Ответ на: комментарий от anonymous 11.06.20 16:46:15 MSK

вот ещё генератор фэнтэзи

buratino ★★★★★
( 11.06.20 16:55:53 MSK ) автор топика
Ответ на: комментарий от buratino 11.06.20 16:55:53 MSK

В процессе финальной схватки герой получает 5000 золотых и по морде. Но он встает и говорит: — Уйди, противный! Злодей от ужаса меняет фамилию.

Всем наступает хэппи-энд, все живут долго и счастливо, а главный герой продолжает в том же духе.

anonymous
( 11.06.20 16:57:25 MSK )
Ответ на: комментарий от anonymous 11.06.20 16:57:25 MSK

он знал

Как оказывается, враг героя — светлая голова. В процессе тяжелого, тупого и нудного разговора выясняется, что герой — хрен моржовый. Вскоре наступает финальная битва между всеми возможными странами, народами и божествами. Напарники героя обижаются и покидают героя.

Сила злодеев такова, что их можно победить только сбросив все, что осталось, в жерло вулкана

anonymous
( 11.06.20 16:58:47 MSK )
Ответ на: комментарий от anonymous 11.06.20 16:57:25 MSK

хоть сейчас в печать:

В одном старом доме с привидениями жил один среднестатистический-ничем-не-примечательный паренек. Из родных и близких у него был воспитавший его друг умершего отца (никому не известный, даже отцу).

И вот однажды к нему подходит странно выглядящий человек и говорит: Ты — избранный! Герой ничуть не удивляется.

Тогда пришелец говорит: — Беги, прячься скорее, ОНИ идут за тобой. Герой со свистом покидает родные места. Он бежит к знакомым странного визитера.

Странный визитер тем временем лежит мертвый.

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

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

Сила злодеев такова, что их можно победить только найдя древний артефакт (или потеряв, если уже нашли)

В процессе финальной схватки герой получает Оскара за лучшую мужскую роль. Но он встает и говорит: — Со мной Сила! Злодей от ужаса меняет фамилию.

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

Разбиение списка на равные части в 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)

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *