【发布时间】:2013-04-15 14:01:46
【问题描述】:
给定一个格式为文件名的排序列表
{artist}-{title}.mp3
我想将文件分配到 255 个 bin(子目录)中,以便每个 bin 包含大致相等数量的文件,并限制艺术家是“原子的”,即任何艺术家都不应将曲目分布在多个目录中。结果也应该保持排序(即忽略分箱,我们仍然有相同的列表排序)。
我已经尝试过:我通过这种方法将列表分成 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
然后,如果艺术家已经有另一首曲目,我会通过将他们移到前一个 bin 中来执行并强制执行艺术家是原子的限制。这种方法是次优的并且被破坏了,因为我留下了很多空箱(由于在某些情况下,同一艺术家的许多曲目)
【问题讨论】:
-
我没有时间实现这个,所以这里有一些伪代码:从列表中获取艺术家姓名,将属于该艺术家的所有文件移动到单独的列表中(称之为@ 987654323@) 并将它们从初始列表中删除。获取其中文件最少的目录(为此编写一个函数),将列表
a中的文件添加到您之前获得的目录中。重复此操作,直到您的初始列表中没有更多文件。 -
对不起,我忘记指定应该保留排序,这意味着您的建议不起作用。我会把它编辑成问题...