Разбить список на n элементов

Допустим, есть список l и число j <= len(l)/2 как разбить список l на j подмассивов так, чтобы длина самого длинного и самого короткого подмассивов отличалась не более чем на 1.


Ответы (3 шт):

Автор решения: Vasily

Я бы реализовал генератор

def generate_sublists(source, sublist_length):
    for i in range(0, len(source), sublist_length):
        yield source[i:i + sublist_length]
→ Ссылка
Автор решения: SergFSM

у меня получилось разбить список таким кодом:

j = 5
l = [1,2,3,4,5,6,7,8,9,10,11,12,13]
res = []

l1,l2 = divmod(len(l), j)
r = [l1+1]*l2 + [l1]*(j-l2)  # длины итоговых списков

temp = l.copy()
for i in r:
    res.append(temp[:i])
    del temp[:i]
    
print(res)  # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11], [12, 13]]

итого, получили заданные пять списков, длина самого длинного-3, самого короткого-2

→ Ссылка
Автор решения: Dmitrij

j = 4   # в оригинале было 5
l = [1,2,3,4,5,6,7,8,9,10,11,12]    #[1,2,3,4,5,6,7,8,9,10,11,12,13] было в оригинале статьи
res = []

if len(l) > (j*2) and len(l) % j != 0:  # проверка на возможность разбиения на
                                        # подмножества в точном соответствии условию
    l1, l2 = divmod(len(l), j)
    r = [l1 + 1] * l2 + [l1] * (j - l2)  # длины итоговых списков
    k = 0    # переменная до 9 знаков занимает 28 байт
             # список в оригинальном примере занимает 184 байта
    for i in r:
        res.append(l[k:k+i])
        k += i    # операция изменения значения переменной дешевле чем изменения списка (вроде как)
    print(res)
else:
    print('impossible')
    
# impossible

Итого, при изменении входных данных на j = 4 и на массив из 12 чисел, мы получили 4 подмассива из 3 чисел каждый, что не соответствует условиям задачи. Однако в условии задачи не сказано, что подмассивы не могут пересекаться. Таким образом при j = (len(list) - 1) по формуле количества сочетаний мы получим len(list) сочетаний. При еще более меньшем j, количество сочетаний растет кратно. Реализация этого не самая короткая, но в конце мы у одного из подмассивов удаляем (или добавляем) один элемент и получаем разницу между наибольшим и наименьшим в 1, что соответствует условию. Однако, даже в таком случае есть ограничения: 1 - количество сочетаний должно быть больше j, 2 - минимальное число элементов в сочетании должно быть больше 1.

→ Ссылка