2012-10-15 27 views
30

मैं इस तरह कुछ करना चाहता हूँ वापस जाने के लिए अनुमति दें:अजगर सूची संलग्न विधि नई सूची

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

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

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

उत्तर

61

संलग्न लेकिन संयोजन के बजाय का उपयोग न करें:

yourList = myList + [40] 

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

+0

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

+1

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

+0

@CiprianTomoiaga: यह भी देखें [पायथन बीडीएफएल से यह ईमेल] (https://mail.python.org/pipermail/python-dev/2003- ऑक्टेट/038855.html)। –

5

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

तुलना में बहुत अधिक समय लगता है

आशा इस मदद करता है

+0

लेकिन बिल्ट-इन को उप-वर्गीकृत किया जा सकता है और फिर कुछ भी जाता है :) –

+0

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

+2

अपनी स्वयं की संवेदना और आपके सहकर्मियों के लिए आपको कभी ऐसा नहीं करना चाहिए :) –

0

आप केवल myList.append (40)

करने की जरूरत है यह, मूल सूची में जोड़ देंगे, एक नई सूची वापस नहीं।

1

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

#!/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() 

आशा है कि मदद करता है।

0

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

0

बस Storstamp के जवाब पर विस्तार करने के लिए

आप केवल myList.append (40)

करने की ज़रूरत है यह मूल सूची में जोड़ देंगे, अब आप मूल सूची से युक्त चर लौट सकते हैं।

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

2

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

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

जब आप कार्य करें:

myList + [40] 

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

संबंधित मुद्दे