Ich habe eine Liste von Nummern (Beispiel: [-1, 1, -4, 5]
) und ich muss Nummern aus der Liste entfernen, ohne die Gesamtsumme der Liste zu ändern. Ich möchte die Zahlen mit dem größten absoluten Wert, der möglich ist, entfernen, ohne die Summe zu ändern, in dem Beispiel wird das Entfernen [-1, -4, 5]
[1]
verlassen, so ändert sich die Summe nicht.Nummern aus einer Liste entfernen, ohne Gesamtsumme zu ändern
Ich schrieb den naiven Ansatz, der alle möglichen Kombinationen findet, die die Summe nicht ändern und sehen, welche den größten absoluten Wert entfernt. Aber das ist wirklich langsam, da die tatsächliche Liste viel größer sein wird.
Hier ist meine Kombinationen Code:
from itertools import chain, combinations
def remove(items):
all_comb = chain.from_iterable(combinations(items, n+1)
for n in xrange(len(items)))
biggest = None
biggest_sum = 0
for comb in all_comb:
if sum(comb) != 0:
continue # this comb would change total, skip
abs_sum = sum(abs(item) for item in comb)
if abs_sum > biggest_sum:
biggest = comb
biggest_sum = abs_sum
return biggest
print remove([-1, 1, -4, 5])
Es corectly (-1, -4, 5)
druckt. Ich suche jedoch nach einer cleveren, effizienteren Lösung, als alle möglichen Artikelkombinationen zu durchlaufen.
Irgendwelche Ideen?
In diesem Fall ist es ein Gewinn, wenn wir, dass die Beobachtung Summe ist ein Element in dieser Liste. Wenn wir 'sum (items)' und 'abs_sum (items)' haben, ist es wahrscheinlich effizienter, die Summe mit 1, 2, 3 usw. aus der Liste zu addieren, beginnend mit dem leeren Listenfall anstelle der vollständigen Liste (?) – u0b34a0f6ae
Sie sollten wahrscheinlich 'smallest_abs_sum' anstelle von' big_sum' speichern. Betrachte: '[1, -1,100, -100]'. – jfs
@ J.F. Sebastian: Wenn die Eingabe "[1, -1,100, -100]" ist, sollte alles entfernt werden ("abs_sum" von "202"), wobei die Summe "0" beibehalten wird. – nosklo