2010-07-28 22 views
6

कौन सा अधिक कुशल है? प्रत्येक का सामान्य उपयोग क्या है?पायथन में सूचियों और टुपल्स के बीच क्या अंतर है?

+1

संबंधित (यदि नहीं एक नकली): http://stackoverflow.com/questions/3340539/why-tuple-is-faster-than-list – bernie

+1

@Adam - मुझे लगता है कि नकल नहीं है, लेकिन बहुत प्रासंगिक है। – Steve314

उत्तर

7

सूचियां म्यूटेबल अनुक्रम हैं, जिनमें बहुत सारे और बहुत से तरीकों (दोनों उत्परिवर्तनीय और गैर-उत्परिवर्तनीय वाले) हैं, जिन्हें अक्सर सामान्य उद्देश्य कंटेनर के रूप में उपयोग किया जाता है (उनकी वस्तुएं किसी भी प्रकार की वस्तुएं हो सकती हैं, हालांकि इसे कभी-कभी माना जाता है सूचियों के लिए बेहतर शैली उन वस्तुओं को रखने के लिए समान प्रकार या प्रकारों का उपयोग करने के लिए समान रूप से उपयोग किया जाता है)।

ट्यूपल्स बहुत कम विधियों (सभी गैर-उत्परिवर्तनीय विशेष वाले) के साथ अपरिवर्तनीय अनुक्रम हैं, जिनका उपयोग अक्सर एक कंटेनर को किसी सेट में एक आइटम या एक कुंजी में एक कुंजी के रूप में उपयोग करने के उद्देश्य से अपरिवर्तनीयता की आवश्यकता होती है। (हालांकि वस्तुओं को काम करने के लिए अपरिवर्तनीय होना चाहिए - उदाहरण के लिए स्ट्रिंग्स, संख्याएं, या अन्य नेस्टेड टुपल्स)। उनकी वस्तुएं किसी भी प्रकार की वस्तुएं हो सकती हैं और ट्यूपल्स के लिए कई अलग-अलग और विशिष्ट प्रकार के सामान होने के लिए यह सामान्य बात है।

ऐसे कुछ मामले हैं जिनमें या तो एक टुपल या एक सूची भी अच्छी तरह से सेवा करेगी, और ऐसे कुछ मामलों में तथ्य यह है कि टुपल्स थोड़ा छोटे और तेजी से निर्माण के लिए निर्णय के लिए निर्णय ले सकते हैं tuples। उदाहरण के लिए, एक समारोह से अधिक परिणाम वापस जाने के लिए की जरूरत है जब, यह सबसे सामान्य उपयोग करने के लिए

return fee, fie, foo, fum 

यानी, प्रश्न में चार वस्तुओं के साथ एक टपल लौटने के बजाय

return [fee, fie, foo, fum] 

यानी है, एक सूची प्रदान चार वस्तुओं के साथ - प्रदर्शन (छोटे लाभ) के अलावा, "एक टुपल लौटाएं" आम मुहावरे भी इस मुद्दे से संबंधित है कि अक्सर कई परिणाम लौटाए जाते हैं और न ही अदला-बदले जाने योग्य प्रकार, इसलिए, स्टाइलिस्टिक रूप से बोलते हुए, किसी सूची का उपयोग करके वैसे भी एक और संदिग्ध विकल्प माना जा सकता है।

tuple का एक उपयोगी संस्करण इसके उप-प्रकार collections.namedtuple (पाइथन 2.6 या बेहतर की आवश्यकता है) जो आपको नाम (विशेषता वाक्यविन्यास के साथ) के साथ-साथ इंडेक्स (सामान्य तरीके) द्वारा आइटम तक पहुंचने देता है। उदाहरण के लिए, मॉड्यूल के शीर्ष पर एक import collections साथ, ऊपर return बयान हो सकता है ...

freturn = collections.namedtuple('freturn', 'fee fie foo fum') 

def f(): 
    ... 
return freturn(fee, fie, foo, fum) 

अब, f() के फोन करने वाले बस के रूप में पहले एक टपल के रूप में अपनी वापसी मान इस्तेमाल कर सकते हैं,, लेकिन होगा अच्छे विकल्प जैसे ...:

r = f() 
print r.fie 

के एवज में कम तुरंत स्पष्ट और पठनीय

print r[1] 

यह ध्यान रखें कि किसी नामित टपल उपवर्ग collections.namedtuple के साथ किए गए अनिवार्य रूप से एक टपल सीधे का उपयोग कर के साथ तुलना में कोई अतिरिक्त भूमि के ऊपर है महत्वपूर्ण है, या, जैसे दस्तावेज़ों ने इसे रखा,

वे हल्के वजन वाले हैं और नियमित tuples की तुलना में अधिक स्मृति की आवश्यकता नहीं है।

+0

मुझे लगता है कि डॉक्स को उस पर चमक होनी चाहिए, नामित टुपल के कई उदाहरणों में गड़बड़ कर दिया गया है, कोई अतिरिक्त ओवरहेड नहीं है, लेकिन कुछ अतिरिक्त मेमोरी का उपयोग किया जा रहा है, क्योंकि आप प्रभावी ढंग से गतिशील रूप से एक नया प्रकार बना रहे हैं (जो, निश्चित रूप से है कुछ, यद्यपि मामूली, स्मृति पदचिह्न)। (अभी भी एक बहुत ही सही जवाब के लिए +1, बीटीडब्ल्यू मिला है)। –

3

सूचियां परिवर्तनीय हैं (बदला जा सकता है), टुपल्स अपरिवर्तनीय हैं। विशिष्ट उपयोग: यह अपेक्षाकृत पतला लगता है लेकिन जब आप मानों को बदलने की आवश्यकता होती है तो आप सूचियों का उपयोग करते हैं। ट्यूपल्स आम तौर पर उनकी अपरिवर्तनीयता के कारण थोड़ा अधिक कुशल होते हैं (जब तक कि आप उन्हें सूचियों की तरह उपयोग नहीं कर रहे हैं और उन्हें बहुत डुप्लिकेट कर रहे हैं ...)

6

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

this पढ़ें।

+0

लिंक पूरी तरह से सेट को अनदेखा करता है (और अन्य, कम आम तौर पर इस्तेमाल किए गए संग्रह जो मूल रूप से दूसरों के भिन्नता होते हैं - फ्रोजनसेट एक अपरिवर्तनीय सेट है, इसे एक सूची (कुछ वाक्य रचनात्मक चीनी के साथ) बाइट करता है ...)। प्रश्न में अभी भी +1 – delnan

+0

'सेट' का उल्लेख नहीं किया गया था, तो उत्तर में क्यों उल्लेख किया जाना चाहिए? हां, 'सेट' और' फ्रोजनसेट 'में' सूची' और 'tuple' के बीच तुलनात्मक अंतर हैं। जबकि मैं 'सेट की लगभग' जितनी बार करता हूं 'सूची और' tuple 'का उपयोग नहीं करता, वे मेरे टूलबॉक्स में एक अमूल्य उपकरण हैं। –

+1

मैं नाइट-पिकिंग कर रहा हूं, लेकिन अपरिवर्तनीयता अक्षमता का संकेत नहीं देती है, म्यूटेबल होने के अलावा किसी भी चीज का तात्पर्य है कि कुछ हड़ताली नहीं है। उदाहरण के लिए उपयोगकर्ता परिभाषित कक्षाओं के उदाहरण डिफ़ॉल्ट रूप से हैशबल हैं, लेकिन इसका मतलब यह नहीं है कि वे अपरिवर्तनीय हैं। माना जाता है कि एक अपरिवर्तनीय प्रकार के लिए यह असामान्य नहीं होगा, लेकिन यह निश्चित रूप से संभव है। –

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