объединение файлов в каталоги примерно одинакового размера
Учитывая отсортированный список имен файлов в форме
{artist}-{title}.mp3
Я хочу распределить файлы по 255 бинам (подкаталогам), чтобы каждый бин содержал примерно одинаковое количество файлов, с ограничением на то, что исполнители являются «атомарными», то есть ни у одного исполнителя не должно быть треков, распределенных по более чем одному каталогу. Результат должен остаться отсортированным (т. Е. Игнорируя биннинг, у нас все тот же порядок в списке).
Что я уже пробовал: я делю список ровно на 255 частей этим методом:
def partition(lst, n):
q, r = divmod(len(lst), n)
indices = [q * i + min(i, r) for i in range(n + 1)]
result = [lst[indices[i]:indices[i + 1]] for i in range(n)]
assert sum(len(x) for x in result) == len(lst)
assert len(set(len(x) for x in result)) <= 2
return result
А затем я проверяю и применяю ограничение, согласно которому артисты являются атомарными, перемещая их в предыдущую корзину, если у них там уже есть другой трек. Этот метод неоптимален и не работает, потому что у меня осталось много пустых корзин (из-за того, что в некоторых случаях у одного исполнителя много треков)