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

я попал на интересную задачу которую и пытаюсь решить, она должна разрезать 1 массив на несколько подмассивов по интересному принципу, я почти доделал ее, но для окончательного решения нужно создать код который автоматически будет вносить числа в вложенный массив, а все коды на которые я натыкаюсь не подходят для этой задачи (т.к. в большинстве они завязаны на том что в заранее известна точная длина массивов). ниже я приведу весь код с объяснением шагов (п.с. надеюсь никого не запутал))
1 2 3 4 5 6 7 8 9 10
def Cut(tubl,a):# tubl это вносимый массив c = 1 cut = [] for i in range(3,a+1,2): # этот цикл должен определять сколько всего будет вложенных массивов и передает данные которые помогут определить b b=i*i # определяет на какой цифре закончится определенный вложенный массив, соответственно c наоборот for j in range(c+1,b+1): # здесь и должен находиться код который будет вкладывать J в вложенный массив массива cut c = b print(cut) Cut([2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],5)
на выходе должно получиться что-то на вроде этого:
cut = [[2,3,4,5,6,7,8,9],[10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]]
я знаю что возможно объяснил не все или объяснил, но непонятно, поэтому задавайте вопросы если что.
в заранее спасибо!
Разбить список на равные части в 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.
Заключение
В этой статье мы рассмотрели способы, с помощью которых можно разбить список на части равного размера на основе пользовательских методов и с помощью встроенных модулей.
Методы, упомянутые в этой статье, не ограничиваются теми, которые были прописаны здесь, но есть множество других творческих способов, с помощью которых вы также можете разделить свой список на равные части!
Разбить массив на несколько массивов по условию [закрыт]
Учебные задания допустимы в качестве вопросов только при условии, что вы пытались решить их самостоятельно перед тем, как задать вопрос. Пожалуйста, отредактируйте вопрос и укажите, что именно вызвало у вас трудности при решении задачи. Например, приведите код, который вы написали, пытаясь решить задачу
Закрыт 12 месяцев назад .
Помогите, пожалуйста разбить массив на несколько по условию. Имеется примерно такой массив (из внешнего файла):
TIMESTEP: 1 ITEM: ATOMS x y z 1 2 3 1 2 3 2 2 3 TIMESTEP: 2 ITEM: ATOMS x y z 2 3 4 4 4 4 5 5 5 7 7 7 TIMESTEP: 3 ITEM: ATOMS x y z 2 3 4 4 4 4 5 5 5 3 2 1 1 1 1 1 1 1 6 6 6
Пользователь вводит значение TIMESTEP в консоли, и выводится массив значений, соответствующий данному шагу. Количество элементов в пределах одного такого подмассива - разное. Я думала, что нужно как-то работать с повторяющимися строками ITEM: ATOMS x y z, но не могу сообразить как.
Отслеживать
Ксюша Иваничкина
задан 1 фев 2023 в 12:28
Ксюша Иваничкина Ксюша Иваничкина
3 2 2 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
def split_array(file_content, step): step_data = [] lines = file_content.split("\n") reading_data = False for line in lines: if "TIMESTEP: " + str(step) in line: reading_data = True elif "TIMESTEP: " in line: reading_data = False elif reading_data: step_data.append(line) return step_data file_content = "TIMESTEP: 1\nITEM: ATOMS x y z\n1 2 3\n1 2 3\n2 2 3\nTIMESTEP: 2\nITEM: ATOMS x y z\n2 3 4\n4 4 4 \n5 5 5\n7 7 7\nTIMESTEP: 3\nITEM: ATOMS x y z\n2 3 4\n4 4 4 \n5 5 5\n3 2 1 \n1 1 1\n1 1 1 \n6 6 6" step = int(input("Введите номер: ")) step_data = split_array(file_content, step) print("Данные для шага", step, ":") print("\n".join(step_data))
Отслеживать
ответ дан 1 фев 2023 в 13:04
1,078 10 10 серебряных знаков 27 27 бронзовых знаков
-
Важное на Мете
Похожие
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.26.3951
Как разбить массив на подмассивы используя «0» как разделитель?

Если есть ещё какие-нибудь интересные решения, можете приложить в комментарии к ответу.
Ответ написан более года назад
Комментировать
Нравится 1 Комментировать

Сергей П @trapwalker Куратор тега Python
Программист, энтузиаст
Без сторонних либ я бы делал так:
def split0(arr: list) -> list: res = [[]] for x in arr: res[-1].append(x) if x else res.append([]) return res
А вот для любителей функциональщины:
from itertools import takewhile def split0(a): it = iter(a) return [[x for x in takewhile(bool, it)] for _ in range(a.count(0) + 1)]
Ответ написан более года назад
Нравится 1 2 комментария

В последнем решении есть небольшая опечатка, вот исправленный вариант:
from itertools import takewhile def split0(a): it = iter(a) return [[x for x in takewhile(bool, it)] for _ in range(a.count(0) + 1)]

Сергей П @trapwalker Куратор тега Python