बदलने के बिना किसी सूची से संख्याओं को हटाएं मेरे पास संख्याओं की एक सूची है (उदाहरण: [-1, 1, -4, 5]
) और मुझे सूची के कुल योग को बदले बिना सूची से संख्याओं को निकालना होगा। मैं संख्या को सबसे बड़ा पूर्ण मूल्य के साथ हटा देना चाहता हूं, कुल मिलाकर, [-1, -4, 5]
को हटाने में उदाहरण [1]
छोड़ देगा, इसलिए योग नहीं बदलेगा।कुल योग
मैंने निष्पक्ष दृष्टिकोण लिखा है, जो कुल संभव संयोजनों को ढूंढ रहा है जो कुल में परिवर्तन नहीं करते हैं और देखें कि कौन सा सबसे बड़ा पूर्ण मूल्य हटा देता है। लेकिन यह वास्तव में धीमा है क्योंकि वास्तविक सूची उस से बहुत बड़ी होगी।
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])
यह corectly प्रिंट (-1, -4, 5)
:
यहाँ मेरी संयोजन कोड है। हालांकि मैं सभी संभावित आइटम संयोजनों पर लूपिंग से कुछ चालाक, अधिक कुशल समाधान की तलाश में हूं।
कोई विचार?
इस मामले में, यह एक जीत है योग इस सूची में एक आइटम है। यदि हमारे पास 'योग (आइटम)' और 'abs_sum (आइटम)' है तो यह सूची से 1, 2, 3, आदि तत्वों का उपयोग करके योग में जोड़ने की कोशिश कर रहा है, जो रिक्त सूची मामले से शुरू हो रहा है पूरी सूची के बजाय (?) – u0b34a0f6ae
आपको शायद 'big_sum' के बजाय' smallest_abs_sum' को सहेजना चाहिए। विचार करें: '[1, -1,100, -100] '। – jfs
@ जेएफ। सेबेस्टियन: यदि इनपुट '[1, -1,100, -100] है, तो उसे' 0' रखने के दौरान सबकुछ हटाया जाना चाहिए ('' 202' का 'abs_sum')। – nosklo