Python:将值列表拆分为两个值列表.列表的总和应尽可能相等



所以,我是一个蟒蛇新手...谢谢你的建议。

我是一名黑胶母带工程师,我经常需要重新排列歌曲顺序,以保持黑胶唱片两侧的运行时间尽可能低(出于质量原因(。通常,我手动完成 - 反复试验。

现在,我正在学习python几个星期,我认为用一个小脚本解决这个问题是正确的问题。

所以我有一个对列表(歌曲编号,长度(。 如何计算两个最接近专辑总播放时间一半的歌曲列表?

谢谢!

编辑01: 所以这就是我设法编码的东西,感谢希思。它似乎:)

from itertools import combinations
song_lengths = [3.20, 2.40, 6.34, 1.20, 3.30, 4.12]
total_time = sum(song_lengths)
print("Totaltime: " + str(total_time))
half_time = total_time / 2
print("Halftime: " + str(half_time))
diff_time = half_time
for n in range(len(song_lengths)):
for first_half in combinations(song_lengths, n):
if abs(half_time - sum(first_half)) < diff_time:
diff_time = half_time - sum(first_half)
perfect_half = first_half
print("The perfect combination is " + str(perfect_half) + " with a total   playing time of " + str(sum(perfect_half)))

像许多编程挑战一样,这是一个找到更容易或更好地理解的等效问题并解决它们的问题。

因此,首先,请注意,第二边长度是多少并不重要 - 如果第一边接近总长度的一半,那么第二边也将是(相同数量(。现在我们只需要找到一组接近总长度一半的歌曲。

该集可以有一首或多首歌曲(最多比总数少一首(,但它们的顺序不会影响播放时间。从较大的集合中选择一组或多个元素的过程(顺序无关紧要(称为组合

幸运的是,Python 使迭代组合变得非常简单。从这样开始:

from itertools import combinations
song_lengths = []#fill in your song lengths here
for first_half in combinations(song_lengths, 1):
#check total length of first_half - if it's the best we've seen, then keep a record

现在您需要做的就是将for循环包装在另一个for中,这会将first_half中的轨道数量从1(如我的示例(增加到少一个轨道总数,每次增加一个。

这应该让你开始。如果您遇到困难,请随时回来询问更具体的问题。

旁注:此解决方案不会"扩展",因为随着歌曲数量的增加,它会变得难以忍受的缓慢。我怀疑您永远不需要为超过 20 首歌曲执行此操作,但如果您这样做,那么此解决方案将不再有用!

最新更新