Разбить список на n элементов
Допустим, есть список l и число j <= len(l)/2
как разбить список l на j подмассивов так, чтобы длина самого длинного и самого короткого подмассивов отличалась не более чем на 1.
Ответы (3 шт):
Я бы реализовал генератор
def generate_sublists(source, sublist_length):
for i in range(0, len(source), sublist_length):
yield source[i:i + sublist_length]
у меня получилось разбить список таким кодом:
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
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.