フォームのファイル名のソートされたリストが与えられた場合
{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
そして、アーティストが既に別のトラックを持っている場合は、前のビンに移動することで、アーティストがアトミックであるという制限を適用します。多くの空のビンが残っているため、この方法は最適ではなく壊れています (場合によっては、同じアーティストによる多くのトラックがあるため)。