Это не красиво, но этот подход должен быть легко понятным.
import math
L = 147
N = 10
links = range(L)
big_size = math.ceil(L/N)
small_size = math.floor(L/N)
num_big_size = round(N * (L/N - small_size))
chunks = []
ind = 0
for i in range(N):
if i < num_big_size:
chunks.append(list(links[ind:ind+big_size]))
ind += big_size
else:
chunks.append(list(links[ind:ind+small_size]))
ind += small_size
Примечание: это не обрабатывает крайние случаи, как некоторые массивы размером 0. В зависимости от того, что вы хотите, вы можете отфильтровать их.
Другой подход с использованием заполнения
import math
L = 147
N = 10
links = range(L)
big_size = math.ceil(L/N)
small_size = math.floor(L/N)
num_big_size = round(N * (L/N - small_size))
links = list(links)
for i in range((num_big_size+1)*big_size-1, N*big_size, big_size):
links.insert(i, None)
chunks = [links[i:i+big_size] for i in range(0,N*big_size,big_size)]
chunks = [ [el for el in line if el is not None] for line in chunks]