所以,我是python newbee ...感谢您的建议。
我是一名乙烯基母带制作工程师,我经常需要重新安排歌曲顺序,以使乙烯基两面的播放时间尽可能短(出于质量原因)。通常,我会手动进行-反复试验。
现在,我正在学习python几周了,我认为用一个小的脚本来解决这个问题将是正确的问题。
所以我有一个配对列表(Songnumber,Length)。 如何计算两个最接近专辑总播放时间一半的歌曲列表?
谢谢!
Edit01: 这就是我由于希思(Heath)而设法编写的代码。似乎有效:)
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)))
答案 0 :(得分:0)
像许多编程挑战一样,这是找到更容易或更容易理解的等效问题,并加以解决的问题。
因此,首先请注意,第二边的长度无关紧要-如果第一边的长度接近第二边的长度的一半,则第二边的长度也一样(相等)。现在我们只需要找到一组接近总长度一半的歌曲即可。
该曲目可能包含一首或多首歌曲(最多少于一首),但是它们的顺序不会影响播放时间。从大集合中选择一个或多个元素的集合(顺序无关紧要)的过程称为组合。
幸运的是,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首歌曲做这件事,但是如果您这样做,那么此解决方案将不再有用!