नई सूची वापस करने के लिए सूची परिशिष्ट () विधि को कैसे अनुमति दें


85

मैं कुछ इस तरह करना चाहता हूं:

myList = [10, 20, 30]
yourList = myList.append(40)

दुर्भाग्य से, सूची परिशिष्ट संशोधित सूची वापस नहीं करता है।

तो, मैं appendनई सूची को वापस करने की अनुमति कैसे दे सकता हूं ?

जवाबों:


148

इसके बजाय अपेंडेंस का उपयोग न करें:

yourList = myList + [40]

यह एक नई सूची देता है ; myListप्रभावित नहीं होगा। यदि आपको किसी भी तरह सेmyList प्रभावित करने की आवश्यकता है , तो असाइन करें.append()yourList अलग से (एक प्रति)myList


2
एक ही सूची के बजाय append()लौटने के पीछे तर्क क्या होगा None? यह किस ज़ीन के सिद्धांत का उल्लंघन करेगा?
सिप्रियन टोमोयाग्यो

3
@CiprianTomoiaga: en.wikipedia.org/wiki/Command%E2%80%93query_separation देखें ; list.appendएक कमांड है, एक क्वेरी नहीं है।
मार्टिन पीटर्स


2
@Dieblitzen: सही है, इसलिए OCaml लिंक की गई सूचियों का उपयोग करता है और उन लोगों को जोड़ता है। अजगर सूचियाँ अपरिवर्तनीय नहीं हैं, इसलिए आप उन लोगों के साथ ऐसा नहीं कर सकते हैं, और इसके अलावा, बाकी सब कुछ परिवर्तनशील हो सकता है । जबकि एक OCaml सूची में अपरिवर्तनीय वस्तुएँ होती हैं, Python में टुपल्स जैसी अपरिवर्तनीय वस्तुओं की सामग्री अभी भी परिवर्तनशील हो सकती है, इसलिए आप सामग्री को अन्य कंटेनरों के साथ साझा नहीं कर सकते हैं जब कंक्रीटिंग करते हैं।
मार्टिन पीटर्स

2
@ डायब्लिटजन: पायथन में यही कारण है कि एक कॉन्फैक्शन ऑपरेशन के लिए वैध होने के लिए, आपको एक उथली प्रतिलिपि बनाना होगा, और ओ (एन) समय का भुगतान करना होगा। मुझे और अधिक स्पष्ट होना चाहिए, क्षमा करें।
मार्टिन पीटर्स

22

अजगर 3 में आप पुराने को अनपैक करके और नया तत्व जोड़कर नई सूची बना सकते हैं:

a = [1,2,3]
b = [*a,4] # b = [1,2,3,4] 

जब तुम करोगे:

myList + [40]

आपके पास वास्तव में 3 सूचियाँ हैं।


1
और यह थोड़ा और तेज़ है
एरोबोमैट

6

list.appendएक अंतर्निहित है और इसलिए इसे बदला नहीं जा सकता है। लेकिन अगर आप इसके अलावा कुछ और उपयोग करने को तैयार हैं append, तो आप कोशिश कर सकते हैं +:

In [106]: myList = [10,20,30]

In [107]: yourList = myList + [40]

In [108]: print myList
[10, 20, 30]

In [109]: print yourList
[10, 20, 30, 40]

निश्चित रूप से, इसका नकारात्मक पक्ष यह है कि एक नई सूची बनाई जाती है, जिसकी तुलना में बहुत अधिक समय लगता है append

उम्मीद है की यह मदद करेगा


लेकिन बिल्ट इन सबक्लास किया जा सकता है और फिर कुछ भी हो जाता है :)
Marcin Wyszynski

@MarcinWyszynski: हाँ, लेकिन उन्हें केवल उपवर्ग के भीतर ही संशोधित किया जा सकता है। बिल्ट-इन ऑब्जेक्ट / क्लास का बिल्ट-इन मेथड शायद ही कभी ओवरराइट किया जा सकता है, अगर कभी
इंस्पेक्टरगैजेट

3
अपनी खुद की पवित्रता और अपने सहकर्मियों के लिए आपको कभी ऐसा नहीं करना चाहिए :)
Marcin Wyszynski

2

आप अंतर्निहित सूची प्रकार को उप-वर्ग कर सकते हैं और 'परिशिष्ट' विधि को फिर से परिभाषित कर सकते हैं। या इससे भी बेहतर, एक नया बनाएं जो वही करेगा जो आप करना चाहते हैं। नीचे एक पुन: परिभाषित 'परिशिष्ट' विधि के लिए कोड है।

#!/usr/bin/env python

class MyList(list):

  def append(self, element):
    return MyList(self + [element])


def main():
  l = MyList()
  l1 = l.append(1)
  l2 = l1.append(2)
  l3 = l2.append(3)
  print "Original list: %s, type %s" % (l, l.__class__.__name__)
  print "List 1: %s, type %s" % (l1, l1.__class__.__name__)
  print "List 2: %s, type %s" % (l2, l2.__class__.__name__)
  print "List 3: %s, type %s" % (l3, l3.__class__.__name__)


if __name__ == '__main__':
  main()

उम्मीद है की वो मदद करदे।


2

प्रयोग करके देखें itertools.chain(myList, [40])। यह एक जनरेटर को एक अनुक्रम के रूप में लौटाएगा, बजाय एक नई सूची आवंटित करने के। अनिवार्य रूप से, यह सभी तत्वों को पहले चलने वाले से लौटाता है जब तक कि यह समाप्त नहीं हो जाता है, फिर अगले चलने योग्य तक आगे बढ़ता है, जब तक कि सभी पुनरावृत्तियां समाप्त नहीं हो जाती हैं।


1

बस स्टॉर्स्टैंप के जवाब पर विस्तार करने के लिए

आपको केवल myList.append (40) करने की आवश्यकता है

यह इसे मूल सूची में जोड़ देगा, अब आप मूल सूची वाले चर को वापस कर सकते हैं।

यदि आप बहुत बड़ी सूचियों के साथ काम कर रहे हैं तो यह रास्ता तय करना है।


-5

आपको केवल myList.append (40) करने की आवश्यकता है

यह इसे मूल सूची में जोड़ देगा, नई सूची नहीं लौटाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.