2016-10-24 3 views
-3

Я хотел бы уменьшить длину списка (скажем, от len(list1) = L до len(list2) = M, где M<=L); однако, сохраняйте сумму своих элементов одинаковой.Python - Изменение длины списка, но сохранение суммы одинаковой

Сверху моей головы я могу думать о суммировании случайных элементов в списке, пока у меня не будет нужной длины списка. Однако я не могу поместить его в код. Есть ли способ, которым вы можете направить меня? Или вы можете подумать о более эффективном способе выполнения этой задачи?

Примечание: В идеале я хотел бы также сохранить элементы окончательного списка между определенной верхней границей и некоторой нижней границей.

Спасибо за любые предложения!

+0

Я голосующий, чтобы закрыть этот вопрос как не относящийся к теме, потому что Stack Overflow не является службой написания кода. –

ответ

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] 
0

Похоже, вы должны выскочить наименьший элемент исчезнет из списка, а затем добавить его в следующий маленький. Что-то вроде

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

Мы можем гарантировать, что M будет больше нуля, потому что сумма элементов всегда будет равна нулю.

Имея это в виду, вы можете поместить два элемента из списка и добавить их суммы.

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

Если вам нужно, чтобы список1 и список2 были разными, скопируйте их в начале и сделайте это в списке2.

0

Это не совсем понятно, что вы хотите, так что есть несколько вариантов:

если вы ясно, может быть, последние 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 

 Смежные вопросы

  • Нет связанных вопросов^_^