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

Что-то пишу вообще первый раз, прощу за это прощение)

Предистория:

Для того, чтобы при помощи 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 шт):

Автор решения: Stanislav Volodarskiy

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]]
→ Ссылка
Автор решения: Dark Space

Можно попробовать 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)

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

Про batched можно почитать тут. На русском языке тут

→ Ссылка