Python-更改列表的长度但保持总和不变
我想减少列表的长度(例如,从Python-更改列表的长度但保持总和不变,python,list,python-2.7,size,Python,List,Python 2.7,Size,我想减少列表的长度(例如,从len(list1)=L到len(list2)=M,其中M如果您的任务不超过您的描述,我建议这样做:删除L-M元素,然后将删除元素的总和添加到列表中的一个元素。下面是一个工作示例: >>> list1 = [1,2,3,4,5,6,7,8,9,10] >>> sum(list1) 55 >>> M = 7 >>> sum_removed = sum(list1[M:]) >>>
len(list1)=L
到len(list2)=M
,其中M如果您的任务不超过您的描述,我建议这样做:删除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]
听起来您应该从列表中弹出最小的元素,然后将其添加到下一个最小的元素
while len(my_list) > M:
my_list.sort(reverse=True) #largest to smallest
x = my_list.pop()
my_list[-1] += x
我们可以保证M大于零,因为元素的和总是零
记住这一点,您可以从列表中弹出两个元素并附加它们的总和
a, b = list.pop(), list.pop()
list.append(a + b)
如果您需要list1和list2不同,请在开始时将其复制到list2。您想要什么并不完全清楚,因此有一些选项:
如果清除最后5个元素,这些元素有一个和,f.e.23
同一个列表中的所有其他元素,让我说10,必须变大,在中间:每个值2.3。无论你给每个值加2.3,还是尝试用23的总和计算随机值,这是你的决定
保存边界之间的所有值取决于元素、总和和边界
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
我投票结束这个问题,因为堆栈溢出不是一个代码编写服务。