हमारे पास इनपुट के रूप में निम्नलिखित सूची है:

[[-5, -1], [1, -5], [5, -1]]

मैंने एक फ़ंक्शन बनाया है जो एक सूची के रूप में clist लेता है और number एक यादृच्छिक संख्या जिसे मैं सूची से हटाना चाहता हूं।

फ़ंक्शन को दी गई number वाली सभी नेस्टेड सूचियों को हटा देना चाहिए और नेस्टेड सूची में नकारात्मक number को हटा देना चाहिए

def reduce(self, clist, number):
    self.temp = list(clist)

    # remove the nested list that contain the given number
    for item in clist:
        if number in item:
            self.temp.remove(item)

    # remove the negative number within the nested list
    for obj in self.temp:
        try:
            obj.remove(-number)
        except:
            pass

    return self.temp

आइए 1 को number के रूप में चुनें और कोड चलाएं।

  • पहला for लूप उन सभी नेस्टेड सूचियों को हटा देगा जिनमें दी गई संख्या है और निम्नलिखित प्राप्त करेंगे:

    self.temp = [[-5, -1], [5, -1]]

    clist = [[-5, -1], [1, -5], [5, -1]]

  • दूसरा for लूप नेस्टेड सूचियों के भीतर सभी नकारात्मक number को हटा देना चाहिए लेकिन हमें निम्नलिखित मिलते हैं:

    self.temp = [[-5], [5]]

    clist = [[-5], [1, -5], [5]]

जो मुझे नहीं मिलता है वह यह है कि जब मैं दूसरे for लूप पर काम कर रहा होता हूं, तो clist प्रभावित क्यों होता है, खासकर जब मैं self.temp सूची पर काम कर रहा होता हूं? यह मूल सूची के संदर्भ के बिना होना चाहिए, लेकिन मुझे कुछ याद आ रहा है। मदद?

0
Robert Kodra 19 सितंबर 2019, 17:02

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा लगता है कि नेस्टेड सूची समझ सबसे आसान होगी:

def reduce(clist, number):
    return [[x for x in subl if x != -number] for subl in clist if number not in subl]

print(reduce([[-5, -1], [1, -5], [5, -1]], 1))
# [[-5], [5]]

यह उन सूचियों पर दो बार पुनरावृति करता है जिनमें number शामिल नहीं है, इसलिए थोड़ा अधिक कुशल समाधान होगा, हालांकि वास्तविक गति आपके डेटा पर निर्भर करेगी।

def reduce(clist, number):
    result = []
    for subl in clist:
        temp = []
        for x in subl:
            if x == number:
                break
            elif x != -number:
                temp.append(x)
        else:
            result.append(temp)  # Only happens if there was no break
    return result

यदि आप चाहें तो इस परिणाम को self.temp में सहेज सकते हैं (self पैरामीटर में वापस जोड़ने के बाद), लेकिन यह मेरे लिए स्पष्ट नहीं था कि आपका वास्तविक इरादा परिणाम को ऑब्जेक्ट में सहेजना था या नहीं .

1
Patrick Haugh 19 सितंबर 2019, 14:18