鑑於形式的文件名的排序列表分級文件轉換成大致相等大小的目錄
{artist}-{title}.mp3
我希望將這些文件分發到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
然後我經歷以及他們移動到前面的箱強制的限制,藝術家是原子的:我用這種方法劃分成列表正好255份如果他們已經有另一條軌道。這種方法是次優的和破碎的,因爲我留下了大量的空箱(由於有,在某些情況下,同一藝術家的許多曲目)
我沒有時間來實現這個所以這裏是一些僞代碼:從列表中獲取一個藝術家名字,將屬於該藝術家的所有文件移動到一個單獨的列表中(稱爲'a')並將它們從最初列表中移除。得到文件中文件最少的目錄(爲此寫入一個函數),將列表「a」中的文件添加到之前獲得的目錄中。重複此操作,直到您的初始列表中沒有更多文件。 –
對不起,我忘記指定應該保留排序,這意味着您的建議不起作用。我將它編輯成問題... – wim