我希望减少列表的长度(例如,从len(list1) = L
到len(list2) = M
,其中M<=L
);但是,保持其元素的总和相同。
从我的头脑中,我可以想到在列表中对随机元素求和,直到我得到所需的列表长度。但是,我无法将其放入代码中。有没有办法可以指导我?或者你能想出更好的方法来执行这项任务吗?
注意:理想情况下,我还希望将最终列表的元素保持在某个上限和某个下限之间。
感谢您的任何建议!
答案 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