Python:将值列表分成两个值列表。列表的总和应尽可能相等

时间:2018-10-05 09:42:46

标签: python algorithm list

所以,我是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)))

1 个答案:

答案 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首歌曲做这件事,但是如果您这样做,那么此解决方案将不再有用!