Как разделить список на отдельные списки если заранее не знаешь их количество?
Что-то пишу вообще первый раз, прощу за это прощение)
Предистория:
Для того, чтобы при помощи post запроса отправлять автоматически письмо внутри игры нужно знать id каждого ника(персонажа) в игре. Это делается при помощи другого post запроса, где по нику узнаётся айди. Итого имеем список c 700-2000 ников. Числа могут быть любые. В этом и основная проблема.
Запрос для получения id может быть максимум с 500 никами, тут нужен список на 500.
Получателей письма может быть максимум 50, тут уже нужно будет из полученного json от первого post запроса поделить на словари по 50 элементов в каждом.
Итого мы имеем txt файл с n строками, который сперва должны превратить в список, потом этот список поделить на равные части по 500 или меньше элементов, потом каждые 500 элементов уже словаря поделить по 50. Если заранее знать что ников будет примерно 1354, то получится 3 списка по 500 и 27 списков по 50 элементов и спокойно можно списки запихнуть в переменные обращаясь к индексу, НО увы заранее неизвестно. Может быть и 300 элементов, а может и больше 2000.
Подскажите как реализовать это разбивание по спискам нужной величины и присвоение этих списков в переменные НЕ ЗНАЯ СКОЛЬКО БУДЕТ ЭЛЕМЕНТОВ
`
l = []
for i in open('text.txt'):
l.append(i[:-1])
def partition(l, n):
for i in range(0, len(l), n):
yield l[i:i + n]
n = 500
char_list = list(partition(l, n))
`
Ответы (3 шт):
split_split(seq, n, m) разобъёт последовательность на требуемые части:
import itertools
def chunks(seq, n):
it = iter(seq)
while True:
t = list(itertools.islice(it, n))
if len(t) == 0:
break
yield t
def split_split(seq, n, m):
return [list(chunks(c, m)) for c in chunks(seq, n)]
print(*split_split(range(57), 20, 5), sep='\n')
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]] [[20, 21, 22, 23, 24], [25, 26, 27, 28, 29], [30, 31, 32, 33, 34], [35, 36, 37, 38, 39]] [[40, 41, 42, 43, 44], [45, 46, 47, 48, 49], [50, 51, 52, 53, 54], [55, 56]]
P.S. Подглядел в соседнем ответе рекурсивное решение. Понравилось. Попробовал сам:
def split_split(seq, *args):
if args:
n, *args = args
return [split_split(c, *args) for c in chunks(seq, n)]
return list(seq)
Рекурсивная функция для регулируемого многоуровневого разрезания списка. В аргументе step передается кортеж или список со значениями резов. Так, например (20, 4) - разрезать на 2 уровня, сначала по 20 элементов, потом каждый из них - по 4 элемента. Вариант (100,50,25,5) - разрезать на 4 уровня с указанным дроблением.
def chunk(lst, step, level=None):
if level is None:
level = len(step)
idx = len(step) - level
if level > 0:
out = []
for i in range(0, len(lst) - 1, step[idx]):
out.append(chunk(lst[i:i + step[idx]], step, level - 1))
return out
else:
return lst
lst = list(range(47))
print(*chunk(lst, (20, 4)), sep='\n')
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19]]
[[20, 21, 22, 23], [24, 25, 26, 27], [28, 29, 30, 31], [32, 33, 34, 35], [36, 37, 38, 39]]
[[40, 41, 42, 43], [44, 45, 46]]
Можно попробовать itertools.batched. Он позволяет "порезать" набор на одинаковые куски.
from itertools import batched
list_word = ... # ваш список со строками
first_cut = list(batched(list_word, 500)) # разрезаю большой список на списки по 500 элементов
second_cut = []
for batch in first_cut:
finish_list_str = list(batched(list_word, 20)) # Разбитие строки в 500 символов на 20-символные
second_cut.append(finish_list_str)
Если возникает ситуация, когда элементы нельзя поровну поделить на все наборы, тогда последний набор просто остаётся неполным. Я полагаю, это то, что удовлетворяет вашим требованиям