所以,我是一个蟒蛇新手...谢谢你的建议。
我是一名黑胶母带工程师,我经常需要重新排列歌曲顺序,以保持黑胶唱片两侧的运行时间尽可能低(出于质量原因(。通常,我手动完成 - 反复试验。
现在,我正在学习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 首歌曲执行此操作,但如果您这样做,那么此解决方案将不再有用!