Python - 更改列表的长度但保持总和相同

时间:2016-10-24 13:42:51

标签: python list python-2.7 size

我希望减少列表的长度(例如,从len(list1) = Llen(list2) = M,其中M<=L);但是,保持其元素的总和相同。

从我的头脑中,我可以想到在列表中对随机元素求和,直到我得到所需的列表长度。但是,我无法将其放入代码中。有没有办法可以指导我?或者你能想出更好的方法来执行这项任务吗?

注意:理想情况下,我还希望将最终列表的元素保持在某个上限和某个下限之间。

感谢您的任何建议!

4 个答案:

答案 0 :(得分:1)

如果您的任务不超过您的描述,我建议您:删除L - M元素,然后将删除元素的总和添加到列表中的元素。这是一个有效的例子:

>>> list1 = [1,2,3,4,5,6,7,8,9,10]
>>> sum(list1)
55
>>> M = 7
>>> sum_removed = sum(list1[M:])
>>> sum_removed
27
>>> list2 = list1[:M]
>>> list2
[1, 2, 3, 4, 5, 6, 7]
>>> list[-1] += sum_removed
>>> list2[-1] += sum_removed
>>> list2
[1, 2, 3, 4, 5, 6, 34]
>>> sum(list2)
55

作为一项功能:

def truncate_same_sum(lst, truncate_length):
    sum_removed = sum(lst[truncate_length:])
    res = lst[:truncate_length]
    res[-1] += sum_removed
    return res

>>> list1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> truncate_same_sum(list1, 7)
[1, 2, 3, 4, 5, 6, 34]

答案 1 :(得分:1)

我们可以保证M大于零,因为元素之和总是为零。

考虑到这一点,你可以从列表中弹出两个元素并附加它们的总和。

a, b = list.pop(), list.pop()
list.append(a + b)

如果您需要list1和list2不同,请在开头复制它,然后执行list2。

答案 2 :(得分:0)

听起来你应该弹出列表中的最小元素,然后将它添加到下一个最小元素。像

这样的东西
while len(my_list) > M:
    my_list.sort(reverse=True) #largest to smallest
    x = my_list.pop()
    my_list[-1] += x

答案 3 :(得分:0)

不完全清楚,你想要什么,所以有一些选择:

如果你清除了最后5个元素,这些元素有一个总和f.e。 23 同一个列表中的所有其他元素,让我说10,必须变大,中间:2.3每个值。无论你是为每个值加上2.3还是尝试计算总和为23的随机值,你添加 - 这是你的决定。

保持boundarys之间的所有值取决于元素,总和和边界。

def eliminate_elements(my_list, number_of_elements_to_kill):
    len_old = len(my_list)
    len_new = len_old - number_of_elements_to_kill

    sum_rest = 0.
    for element in my_list[-number_of_elements_to_kill:]:
        sum_rest += element

    for i in range(len_new):
        my_list[i] += sum_rest/len_new

    for i in range(len_new,len_old):
        del my_list[len_new]

a = [1,2,3,4,5,6,7,8]
eliminate_elements(a,2)
print a