2016-10-24 4 views
-3

Ich möchte die Länge einer Liste verringern (zB von len(list1) = L zu len(list2) = M, wo M<=L); Behalten Sie jedoch die Summe seiner Elemente gleich.Python - Die Länge einer Liste ändern, aber die Summe beibehalten

Von der Spitze meines Kopfes kann ich denken, zufällige Elemente in der Liste zu summieren, bis ich die gewünschte Listenlänge habe. Ich kann es jedoch nicht in Code schreiben. Gibt es eine Möglichkeit, zu der du mich führen kannst? Oder können Sie sich einen besseren Weg vorstellen, diese Aufgabe zu erfüllen?

Hinweis: Im Idealfall möchte ich auch die Elemente der endgültigen Liste zwischen einer bestimmten Obergrenze und einer bestimmten Untergrenze halten.

Vielen Dank für Anregungen!

+0

Ich stimme zu, diese Frage als Off-Topic zu schließen, weil Stack Overflow kein Code-Schreibdienst ist. –

Antwort

1

Wenn Ihre Aufgabe nicht mehr als Ihre Beschreibung ist, empfehle ich Folgendes: Entfernen Sie L - M Elemente und fügen Sie dann die Summe der Elemente entfernen zu einem Element in der Liste. Hier ist ein funktionierendes Beispiel:

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

Als Funktion:

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

Es klingt wie Sie das kleinste Element aus der Liste Pop sollten, und fügen Sie dann auf den nächsten kleinsten. Etwas wie

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

Wir können garantieren, dass M größer als Null ist, weil die Summe der Elemente immer Null wäre.

In diesem Sinne können Sie zwei Elemente aus der Liste und fügen Sie ihre Summen an.

Wenn Sie list1 und list2 brauchen, um anders zu sein, kopieren Sie es am Anfang und tun dies zu list2.

0

Es ist nicht ganz klar ist, was Sie wollen, so gibt es einige Möglichkeiten:

, wenn Sie die letzten 5 Elemente vielleicht klar, diese Elemente eine Summe haben, F. E. 23 Alle anderen Elemente in der gleichen Liste, lassen Sie mich 10 sagen, müssen größer werden, in der Mitte: 2,3 jeder Wert. Egal, ob Sie 2,3 auf jeden Wert setzen oder versuchen, zufällige Werte mit der Gesamtsumme von 23 zu berechnen, die Sie hinzufügen - das ist Ihre Entscheidung.

Um alle Werte zwischen den Grenzen zu halten, hängt von Elementen, Summe und Grenzen ab.

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 
Verwandte Themen