सूचियों और टुपल्स के बीच अंतर क्या है?


1019

क्या फर्क पड़ता है?

टुपल्स / सूचियों के क्या फायदे / नुकसान हैं?


13
अन्य लोगों ने नीचे उत्तर दिया, लेकिन मैं यह बताना चाहता हूं कि, imho, python में पूरी तरह से अनइंस्टिट्यूट डेटा प्रकार के नाम हैं। मुझे नहीं लगता कि किसी अन्य भाषा में ट्यूपल्स हैं (उस नाम से), और एक शब्द के रूप में इससे भी बदतर मैं अपनी भाषा में अनुवाद नहीं कर सकता। क्या किसी को पता है कि "टपल" कहां से आता है? डच?
रूक

98
टुपल्स गणित में एक मूल शब्द है, जो लैटिन से लिया गया है (विकिपीडिया देखें)।
निको

128
जोड़ी -> ट्रिपल -> चौगुनी -> क्विंटुपल -> सेक्स्टुपल -> उम, इसे क्या कहा जाता है, आह इसे सॉड, 7-ट्यूपल -> 8-ट्यूपल -> ... इसलिए 'ट्यूपल एक जेनेरिक नाम के रूप में।
जॉन फूही

31
@JohnFouhy यह छह साल बाद खत्म हो गया है, लेकिन: ... सप्तऋषि, अष्टभुज, नौ-तत्वों के साथ, दशमांश, अशुभ, द्विअर्थी ...: D
Augusta

18
@MegaWidget मुझे लगा कि हम स्थापित करेंगे कि एक nontuple था list। ; डी
अगस्ता

जवाबों:


1017

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

इस अंतर का उपयोग करना कोड को अधिक स्पष्ट और समझने योग्य बनाता है।

एक उदाहरण एक पुस्तक में संदर्भ स्थानों के लिए पेज और लाइन नंबर के जोड़े होंगे, जैसे:

my_location = (42, 11)  # page number, line number

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

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

इस मुद्दे पर कुछ दिलचस्प लेख हैं, उदाहरण के लिए "पायथन टुपल्स नॉट जस्ट कॉन्स्टेंट लिस्ट" या "पायथन में सूचियों बनाम ट्यूपल्स को समझना" । आधिकारिक पायथन प्रलेखन में भी इसका उल्लेख है

"ट्यूपल्स अपरिवर्तनीय हैं, और आमतौर पर एक विषम अनुक्रम होता है ..."।

हास्केल की तरह एक वैधानिक रूप से टाइप की गई भाषा में आमतौर पर अलग-अलग प्रकार के होते हैं और टपल की लंबाई निश्चित होनी चाहिए। एक सूची में सभी मान समान हैं और लंबाई तय नहीं है। तो अंतर बहुत स्पष्ट है।

अंत में पाइथन में नेकटुपल है, जो समझ में आता है क्योंकि एक टुपल पहले से ही संरचना के लिए माना जाता है। यह इस विचार को रेखांकित करता है कि ट्यूपल कक्षाओं और उदाहरणों के लिए एक हल्के वजन वाले विकल्प हैं।


11
+1, विशेष रूप से एक महान उदाहरण के साथ आपके दूसरे लिंक के लिए। इस उद्धरण से प्यार करें: "यह एक हल्के रिकॉर्ड या संरचना के रूप में कार्य करता है।"
बाल्टीमार्क

105
"सूचियाँ सजातीय क्रम हैं" - मैं पायथन के लिए नया हूँ, लेकिन विषम सूची नहीं हैं? से docs.python.org/py3k/tutorial/introduction.html : "सूची आइटम सभी एक ही प्रकार है की जरूरत नहीं है।" लेकिन शायद आप औपचारिक अवधारणा के बारे में बोल रहे हैं, न कि पायथन इस पर।
मैथ्यू कॉर्नेल

13
"टपल" के लिए एक अच्छा शब्दार्थ पर्याय "रिकॉर्ड" हो सकता है। यह एक विशिष्ट अनुक्रम में संबंधित डेटा आइटम का एक संग्रह है। वास्तव में मुझे लगता है collections.namedtupleकि बेहतर कहा जाएगा collections.record। इससे ग्राहक के रिकॉर्ड में नाम, पते की अदला-बदली करने का कोई मतलब नहीं होगा; वास्तव में, ऐसा करना आम तौर पर एक त्रुटि होगी, जिसे टपल की अपरिहार्यता आपको कमिट करने से रोकती है।
किंडल

4
@ मिचौली: के बारे में What would you do with such a list?, मैं हमेशा कंपकंपी करता हूं जब पीपीएल एक तर्क के रूप में कल्पना की कमी का उपयोग करता है। मिश्रित प्रकार की सूचियों का उपयोग करना कुछ पदानुक्रमित डेटा संरचनाओं के लिए महान काम करता है, जहां प्रत्येक सूची बाल-सूचियों और मूल्य-तत्वों से बनी होती है।
सेबस्टियन मच

18
क्या यह कहना भ्रामक नहीं है कि ट्यूपल्स विषम हैं और सूचियां सजातीय हैं? उदाहरण के लिए एक सूची में विभिन्न डेटा प्रकारों का मिश्रण हो सकता है जैसे कि l = [1, 2, 'a']। मुझे समझ नहीं आ रहा है कि आप किस बारे में बात कर रहे हैं।
सेलेरिटास

362

सूची और टपल के बीच अंतर

  1. शाब्दिक

    someTuple = (1,2)
    someList  = [1,2] 
  2. आकार

    a = tuple(range(1000))
    b = list(range(1000))
    
    a.__sizeof__() # 8024
    b.__sizeof__() # 9088

    ट्यूपल ऑपरेशन के छोटे आकार के कारण, यह थोड़ा तेज हो जाता है, लेकिन तब तक इसका उल्लेख नहीं किया जाता है जब तक कि आपके पास भारी संख्या में तत्व न हों।

  3. संचालन की अनुमति दी

    b    = [1,2]   
    b[0] = 3       # [3, 2]
    
    a    = (1,2)
    a[0] = 3       # Error

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

    a     = (1,2)
    b     = [1,2]  
    
    id(a)          # 140230916716520
    id(b)          # 748527696
    
    a   += (3,)    # (1, 2, 3)
    b   += [3]     # [1, 2, 3]
    
    id(a)          # 140230916878160
    id(b)          # 748527696
  4. प्रयोग

    एक सूची के रूप में परिवर्तनशील है, यह एक शब्दकोश में एक कुंजी के रूप में इस्तेमाल नहीं किया जा सकता है, जबकि एक tuple का उपयोग किया जा सकता है।

    a    = (1,2)
    b    = [1,2] 
    
    c = {a: 1}     # OK
    c = {b: 1}     # Error

तो क्या होता है जब मैं सूची के आकार को बड़े मूल्यों के आकार में बदलने की कोशिश करता हूं? क्या यह मेमोरी एड्रेस को बदल देगा (जो मेरा मानना ​​है कि आईडी को बदलना चाहिए)। या यह मुझे एक त्रुटि फेंक देंगे?
WanderingMind

17
@WanderingMind: मेमोरी पता जहां सूची मान संग्रहीत किए जाते हैं, मेमोरी पते के समान नहीं है, जहां सूची ऑब्जेक्ट स्वयं संग्रहीत है।
टॉम

2
हम्म् ... इस पोस्ट के सभी कोड को छोड़कर पहले बॉक्स 3. Permitted operationमें टपल मामले को पहले दिखाया गया है। मैं जानता हूं कि सफलता को दिखाना सामान्य है, फिर त्रुटि, लेकिन वह कुछ क्षणों के लिए मेरे सिर के साथ खिलवाड़ है।
dmckee --- पूर्व-मध्यस्थ ने बिल्ली का बच्चा

1
जैसा कि बिंदु 3 के तहत दिखाया गया है, एक एकल तत्व सूची हो सकती है one_item_list = [a], लेकिन one_tuple = (a,)संबंधित टपल है। वैरिएबल नाम के बाद अल्पविराम पर ध्यान दें। लेकिन यह भी ध्यान रखें two_tuple = (a, b)। इसने मुझे एक से अधिक बार (अभी भी पायथन 3 में) दूर फेंक दिया।
mjkrause 16

1
@Cheng क्योंकि ट्यूल को छांटना, इसे बदलना होगा, अर्थात, इसके आइटम बदलें। टुपल्स उस का समर्थन नहीं करते हैं। अजगर में एक हल कर टपल प्राप्त करने के लिए सबसे आसान तरीका हैtuple(sorted(the_unsorted_tuple))
ApproachingDarknessFish

204

यदि आप टहलने के लिए जाते हैं, तो आप अपने निर्देशांक को (x,y)टूप्ले में किसी भी समय नोट कर सकते हैं ।

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

लेकिन आप इसे दूसरी तरह से नहीं कर सकते थे।


37
यह उदाहरण केवल एक सम्मेलन जैसा दिखता है। लोग तर्क दे सकते हैं "मैं अभी भी निर्देशांक नोट करने के लिए [x, y] का उपयोग कर सकता हूं यदि मैं चाहता हूं"। इसलिए, इस उत्तर को तब तक अपूर्ण माना जाता है जब तक कि एक और वाक्य: "आप निर्देशांक को संग्रहीत करने के लिए सूची का उपयोग क्यों न करें, इसके लिए @nikow की पोस्ट पढ़ें"
RayLuo

71
@ इस्बर्ग, मेरा जवाब अंतर्ज्ञान विकसित करने में मदद करने के लिए है। यह विषय की प्रत्येक बारीकियों का पता लगाने के लिए नहीं है।
डैन-जीएफ

8
अच्छा उदाहरण +1। यह टपल तत्वों (यहां निर्देशांक) की पूरक प्रकृति पर जोर देता है, यही कारण है कि उनमें से किसी एक को संशोधित करने की अनुमति नहीं है - क्योंकि यह पूरे टपल के अर्थ को बदलता है (यहां एक बिंदु की स्थिति)।
हाओ वैंग

77

मुख्य अंतर यह है कि ट्यूपल्स अपरिवर्तनीय हैं। इसका मतलब है कि आपने इसे बनाते ही मानों को टूपल में नहीं बदल सकते।

इसलिए यदि आप मानों को बदलने की आवश्यकता के लिए सूची का उपयोग करते हैं।

टुपल्स के लाभ:

  1. थोड़ा सा प्रदर्शन सुधार।
  2. जैसा कि एक टूप्ले अपरिवर्तनीय है, इसका उपयोग एक शब्दकोश में एक कुंजी के रूप में किया जा सकता है।
  3. यदि आप इसे बदल नहीं सकते हैं और न ही किसी और को, जो यह कहना है कि आपको किसी एपीआई कार्यों आदि के बारे में चिंता करने की आवश्यकता नहीं है, तो बिना पूछे अपने टपल को बदल दें।

14
ध्यान दें कि एक ट्यूपल केवल अपरिवर्तनीय है यदि इसके सभी तत्व हैं । आप कह सकते हैं कि सभी अपरिवर्तनीय संग्रहों का सच है, जैसे frozensetया विभिन्न तृतीय-पक्ष जमे हुए तानाशाह / पेड़ / आदि। प्रकार, लेकिन उनमें से कोई भी आपको परस्पर तत्वों को जोड़ने की अनुमति नहीं देता है। (और निश्चित रूप से एक ट्यूबल केवल हैशनेबल है अगर उसके सभी तत्व हैं, जो सामान्य ईएएफपी तरीके से संभालता है, तो d[1, [2]]यह ऊपर उठाएगा TypeError: unhashable type: 'list'।)
गर्भपात

1
एक टपल का उपयोग केवल एक शब्दकोष में एक कुंजी के रूप में किया जा सकता है यदि इसके सभी तत्व अपरिवर्तनीय हैं। देखें यहाँ
विल डेरेहैम

31

सूचियाँ परस्पर हैं; ट्यूपल नहीं हैं।

से docs.python.org/2/tutorial/datastructures.html

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


1
मुझे वास्तव में लगता है कि आपको सिमेंटिक निहितार्थों पर भी विचार करना चाहिए (नीचे मेरा उत्तर देखें)।
निको

शायद ही अब प्रयास के लायक लगता है, लेकिन सिर के लिए धन्यवाद।
duffymo

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

4
यह देखना मजेदार है कि यहां अन्य जवाबों की गुणवत्ता समान है, लेकिन केवल एक टिप्पणीकार "-1" के कारण ही इससे नफरत करता है। और एक और उत्तर है जो गुणवत्ता का सिर्फ 0.5 गुना है, लेकिन केवल 0.1 बार डाउनवोट्स है।
सेबेस्टियन मच

2
@duffymo मुझे लगता है कि यह जवाब इस पृष्ठ पर सबसे स्पष्ट और सबसे संक्षिप्त है। यह टुपल्स और सूचियों के बीच एकमात्र वास्तव में महत्वपूर्ण अंतर का नाम देता है और इस तरह के झूठे सजातीय-बनाम-विषम हॉगवॉश के बारे में अंतहीन रूप से प्रलाप नहीं करता है।
एंटीऑक्ट

20

यह उल्लेख किया गया है कि अंतर काफी हद तक शब्दार्थ है: लोग अलग-अलग सूचनाओं का प्रतिनिधित्व करने के लिए एक टपल और सूची की अपेक्षा करते हैं। लेकिन यह एक दिशानिर्देश से आगे बढ़ता है; कुछ पुस्तकालय वास्तव में अलग-अलग व्यवहार करते हैं जो वे पारित किए जाते हैं। उदाहरण के लिए NumPy को लें ( किसी अन्य पोस्ट से कॉपी किया जाता है जहां मैं और उदाहरणों के लिए पूछता हूं):

>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
       [3, 4, 5]])

बिंदु यह है, जबकि NumPy मानक पुस्तकालय का हिस्सा नहीं हो सकता है, यह एक प्रमुख पायथन पुस्तकालय है, और NumPy सूचियों और टुपल्स के भीतर पूरी तरह से अलग चीजें हैं।


2
यह वास्तव में एक उपयोगी उत्तर नहीं है। अंतर यह है कि type(a_list) != type(a_tuple), लाइब्रेरी कोड ब्रांचिंग पर आधारित कोई भी टुकड़ा type(x)अलग तरह से व्यवहार करेगा
एरिक

1
अच्छा बिंदु, मैंने पोस्ट को संपादित किया है: यह वास्तव में केवल इंगित कर रहा है कि सिमेंटिक दिशानिर्देश कुछ पुस्तकालयों में हार्डकोड किए गए हैं।
शेप

1
तीसरे पक्ष के पुस्तकालयों की तुलना में स्टैडलिब / बिल्डिंस के उदाहरणों का उपयोग करना बेहतर हो सकता है। ऐसे कई स्थान हैं जहां आप एकल मान या मानों का उपयोग कर सकते हैं, और सूची या अन्य अनुक्रम को एकल मान माना जाता है। उदाहरण के लिए, '%d %d' % [2, 3]एक है TypeError, क्योंकि आप पहले एक सूची को पास करने की कोशिश %dकर रहे हैं और आप दूसरे को कोई मूल्य नहीं दे रहे हैं %d। (हालांकि, इसके प्रति भी कई उदाहरण हैं, जैसे max…)
निरस्त करना

यह दिलचस्प है, मुझे नहीं पता था कि पायथन मानक पुस्तकालय में इसके कोई उदाहरण थे। आपके द्वारा कहे गए स्थानों की संख्या?
शेप

18

सूचियाँ लूपिंग के लिए हैं, ट्यूपल संरचना के लिए हैं "%s %s" %tuple

सूचियाँ आमतौर पर सजातीय होती हैं, ट्यूपल्स आमतौर पर विषम होते हैं।

सूचियाँ परिवर्तनशील लंबाई के लिए हैं, टुपल्स निश्चित लंबाई के लिए हैं।


16

यह पायथन सूचियों का एक उदाहरण है:

my_list = [0,1,2,3,4]
top_rock_list = ["Bohemian Rhapsody","Kashmir","Sweet Emotion", "Fortunate Son"]

यह पायथन टपल का एक उदाहरण है:

my_tuple = (a,b,c,d,e)
celebrity_tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")

पायथन की सूची और टुपल्स समान हैं कि वे दोनों मूल्यों के संग्रह का आदेश दिए गए हैं। कोष्ठक "[..., ...]" और कोष्ठक का उपयोग कर टुपल्स "(..., ...)" का उपयोग करके बनाए गए उथले अंतर के अलावा, कोर तकनीकी "पायथन सिंटैक्स में कोडित हार्ड" तकनीकी अंतर उनके बीच अंतर है। यह है कि एक विशेष टपल के तत्व अपरिवर्तनीय हैं, जबकि सूचियाँ परस्पर हैं (... इसलिए केवल टुपल्स हैशेबल हैं और इसका उपयोग शब्दकोश / हैश कीज़ के रूप में किया जा सकता है!)। यह उन अंतरों को जन्म देता है, जिनका वे उपयोग कर सकते हैं या नहीं कर सकते हैं (वाक्यविन्यास द्वारा एक प्राथमिकता को लागू किया जाता है) और लोग कैसे उनका उपयोग करने के लिए चुनते हैं ('सर्वोत्तम प्रथाओं' के रूप में प्रोत्साहित किया जाता है, एक पश्चाताप, यही स्मार्ट प्रोग्रामर करते हैं)। लोग तत्वों के क्रम को देते हैं।

टुपल्स के लिए, 'ऑर्डर' सूचना रखने के लिए सिर्फ एक विशिष्ट 'संरचना' से ज्यादा कुछ नहीं दर्शाता है। पहले फ़ील्ड में कौन से मान पाए जाते हैं उन्हें आसानी से दूसरे फ़ील्ड में स्विच किया जा सकता है क्योंकि प्रत्येक दो अलग-अलग आयामों या पैमानों पर मान प्रदान करता है। वे विभिन्न प्रकार के प्रश्नों के उत्तर प्रदान करते हैं और आम तौर पर फॉर्म के होते हैं: किसी दिए गए ऑब्जेक्ट / विषय के लिए, इसकी विशेषताएँ क्या हैं? वस्तु / विषय स्थिर रहता है, विशेषताएँ भिन्न होती हैं।

सूचियों के लिए, 'ऑर्डर' एक अनुक्रम या एक दिशात्मकता को दर्शाता है। दूसरा तत्व MUST पहले तत्व के बाद आता है क्योंकि यह एक विशेष और सामान्य पैमाने या आयाम के आधार पर 2 वें स्थान पर स्थित है। तत्वों को एक पूरे के रूप में लिया जाता है और ज्यादातर किसी एक प्रश्न के उत्तर दिए जाते हैं, जो आमतौर पर किसी दिए गए विशेषता के लिए होते हैं, इन वस्तुओं / विषयों की तुलना कैसे करते हैं? विशेषता स्थिर रहती है, वस्तु / विषय अलग होता है।

लोकप्रिय संस्कृति और प्रोग्रामर में लोगों के अनगिनत उदाहरण हैं जो इन मतभेदों के अनुरूप नहीं हैं और ऐसे कई लोग हैं जो अपने मुख्य पाठ्यक्रम के लिए सलाद कांटा का उपयोग कर सकते हैं। दिन के अंत में, यह ठीक है और दोनों आमतौर पर काम कर सकते हैं।

कुछ बारीक विवरणों को संक्षेप में प्रस्तुत करना

समानता:

  1. डुप्लिकेट - डुप्लिकेट के लिए ट्यूपल और सूची दोनों की अनुमति देता है
  2. अनुक्रमण, चयन और स्लाइसिंग - दोनों कोष्ठक में पाए जाने वाले पूर्णांक मानों का उपयोग करते हुए अनुक्रमणिका दोनों को सूचीबद्ध करता है। इसलिए, यदि आप दी गई सूची या टपल के पहले 3 मान चाहते हैं, तो सिंटैक्स समान होगा:

    >>> my_list[0:3]
    [0,1,2]
    >>> my_tuple[0:3]
    [a,b,c]
  3. तुलना और छंटनी - दो टुपल्स या दो सूचियों की तुलना उनके पहले तत्व से की जाती है, और यदि एक टाई है, तो दूसरे तत्व द्वारा, और इसी तरह। पहले के तत्वों में अंतर दिखाई देने के बाद बाद के तत्वों पर कोई ध्यान नहीं दिया जाता है।

    >>> [0,2,0,0,0,0]>[0,0,0,0,0,500]
    True
    >>> (0,2,0,0,0,0)>(0,0,0,0,0,500)
    True

अंतर: - एक प्राथमिकता, परिभाषा द्वारा

  1. सिंटैक्स - सूचियों का उपयोग [], टुपल्स का उपयोग ()

  2. म्यूटेबिलिटी - किसी दिए गए सूची में तत्व उत्परिवर्तनीय हैं, किसी दिए गए टपल में तत्व उत्परिवर्तनीय नहीं हैं।

    # Lists are mutable:
    >>> top_rock_list
    ['Bohemian Rhapsody', 'Kashmir', 'Sweet Emotion', 'Fortunate Son']
    >>> top_rock_list[1]
    'Kashmir'
    >>> top_rock_list[1] = "Stairway to Heaven"
    >>> top_rock_list
    ['Bohemian Rhapsody', 'Stairway to Heaven', 'Sweet Emotion', 'Fortunate Son']
    
    # Tuples are NOT mutable:       
    >>> celebrity_tuple
    ('John', 'Wayne', 90210, 'Actor', 'Male', 'Dead')
    >>> celebrity_tuple[5]
    'Dead'
    >>> celebrity_tuple[5]="Alive"
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
  3. हैशटेबल्स (शब्दकोश) - जैसा कि हैशटेबल्स (शब्दकोशों) के लिए आवश्यक है कि इसकी कुंजियाँ हैंज़ेबल हैं और इसलिए अपरिवर्तनीय हैं, केवल ट्यूपल्स ही शब्दकोश कीज़ के रूप में कार्य कर सकते हैं, सूचियाँ नहीं।

    #Lists CAN'T act as keys for hashtables(dictionaries)
    >>> my_dict = {[a,b,c]:"some value"}
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    
    #Tuples CAN act as keys for hashtables(dictionaries)
    >>> my_dict = {("John","Wayne"): 90210}
    >>> my_dict
    {('John', 'Wayne'): 90210}

अंतर - उपयोग में एक पश्चगामी,

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

  2. लूपिंग बनाम संरचनाएं - हालांकि दोनों लूपिंग के लिए अनुमति देते हैं (my_list ... में x के लिए), यह केवल एक सूची के लिए ऐसा करने के लिए वास्तव में समझ में आता है। Tuples संरचित और प्रस्तुत करने की जानकारी के लिए अधिक उपयुक्त हैं (% s% s% s में निवास करने वाला% s है और वर्तमान में% s% ("जॉन", "वेन", 90210, "अभिनेता", "मृत"))


मुझे अपरिवर्तनीयता का एक कारण समझाने के लिए हैशटेबल / हैशटेबल उदाहरण पसंद है- आप एक टफल (रिकॉर्ड / स्ट्रक्चर / कोऑर्डिनेट / वेक्टर / पॉइंट) का उपयोग एक तानाशाह की जटिल कुंजी के रूप में कर सकते हैं।
डेव एक्स

9

सूची के मूल्यों को किसी भी समय लेकिन टुपल्स के मूल्यों को बदला जा सकता है नहीं बदला जा सकता है।

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


7

सूची और टपल के बीच अंतर

ट्यूपल्स और सूचियाँ दोनों पायथन में समान रूप से समान अनुक्रम प्रकार हैं।

  1. शाब्दिक वाक्य रचना

    हम एक नई सूची प्राप्त करने के लिए tuples और वर्ग कोष्ठक के निर्माण के लिए कोष्ठक ( ) का उपयोग करते हैं [ ]। इसके अलावा, हम आवश्यक संरचना प्राप्त करने के लिए उपयुक्त प्रकार के कॉल का उपयोग कर सकते हैं - टपल या सूची।

    someTuple = (4,6)
    someList  = [2,6] 
  2. अस्थिरता

    ट्यूप्स अपरिवर्तनीय हैं, जबकि सूचियाँ परस्पर हैं। यह बिंदु निम्नलिखित लोगों के लिए आधार है।

  3. स्मृति उपयोग

    परिवर्तनशीलता के कारण, आपको सूचियों के लिए अधिक मेमोरी और टुपल्स के लिए कम मेमोरी की आवश्यकता होती है।

  4. विस्तार

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

  5. हैशिंग

    टुपल्स धोने योग्य हैं और सूचियां नहीं हैं। इसका मतलब है कि आप एक शब्दकोश में एक कुंजी के रूप में एक टपल का उपयोग कर सकते हैं। सूची का उपयोग शब्दकोश में एक कुंजी के रूप में नहीं किया जा सकता है, जबकि एक टपल का उपयोग किया जा सकता है

    tup      = (1,2)
    list_    = [1,2] 
    
    c = {tup   : 1}     # ok
    c = {list_ : 1}     # error
  6. शब्दार्थ

    यह बिंदु सर्वोत्तम अभ्यास के बारे में अधिक है। आपको टुपल्स को विषम डेटा संरचनाओं के रूप में उपयोग करना चाहिए, जबकि सूचियां समरूप अनुक्रम हैं।


1
विस्तार और हैशिंग की स्पष्ट चर्चा के लिए मेरा वोट यहाँ है, जिसे मैंने अन्यथा बहुत अच्छे मौजूदा उत्तरों में नोटिस नहीं किया।
dmckee --- पूर्व-संचालक बिल्ली का बच्चा

6

सूचियों को सजातीय अनुक्रम माना जाता है, जबकि ट्यूप विषम डेटा संरचनाएं हैं।


26
इस बिंदु पर, यह उत्तर चर्चा में कुछ भी नहीं जोड़ता है, क्योंकि कई अन्य बेहतर उत्तर हैं।
जोनाथन रेनहार्ट

5

जैसा कि लोग पहले ही यहां जवाब दे चुके tuplesहैं जबकि वह अपरिवर्तनीय हैlists परिवर्तनशील होते हैं, लेकिन tuples का उपयोग करने का एक महत्वपूर्ण पहलू हमें याद रखना चाहिए जो है

यदि tupleइसमें एक listया dictionaryइसके अंदर समाहित है , तो इन्हें बदला भी जा सकता हैtuple ही वह अपरिवर्तनीय हो।

उदाहरण के लिए, मान लें कि हमारे पास एक ट्यूपल है जिसमें एक सूची और एक शब्दकोश है

my_tuple = (10,20,30,[40,50],{ 'a' : 10})

हम सूची की सामग्री को बदल सकते हैं

my_tuple[3][0] = 400
my_tuple[3][1] = 500

जो नया टपल जैसा दिखता है

(10, 20, 30, [400, 500], {'a': 10})

हम भी tuple के अंदर शब्दकोश को बदल सकते हैं

my_tuple[4]['a'] = 500

जो समग्र टपल जैसा दिखाई देगा

(10, 20, 30, [400, 500], {'a': 500})

ऐसा इसलिए होता है listऔरdictionary वस्तुओं रहे हैं और इन वस्तुओं को नहीं बदलते हैं, लेकिन सामग्री इसके इशारा करने के लिए।

तो tupleबिना किसी अपवाद के अपरिवर्तनीय रहता है


इस पोस्ट में सुधार किया जाएगा यदि आपने समझाया कि "यदि अपरिवर्तनीय रूप से ट्यूपल को भी बदला जा सकता है।" ऐसा इसलिए है क्योंकि वे ऑब्जेक्ट अपनी पहचान बनाए रखते हैं (इसलिए टुपल नहीं बदला है क्योंकि इसमें अभी भी वही ऑब्जेक्ट हैं ...)।
dmckee --- पूर्व-संचालक बिल्ली का बच्चा

3

पीईपी 484 - प्रकार संकेत का कहना है कि एक के तत्वों के प्रकार tupleअलग-अलग टाइप किया जा सकता है; ताकि आप कह सकें Tuple[str, int, float]; लेकिन एक list, Listटाइपिंग क्लास केवल एक ही प्रकार का पैरामीटर ले सकता है:List[str] जो संकेत देता है कि 2 का अंतर वास्तव में है कि पूर्व विषम है, जबकि बाद वाला आंतरिक रूप से सजातीय है।

इसके अलावा, मानक पुस्तकालय ज्यादातर ऐसे मानक कार्यों से वापसी मूल्य के रूप में टपल का उपयोग करता है जहां सी वापस आ जाएगा struct


3

जैसा कि लोगों ने पहले ही मतभेदों का उल्लेख किया है कि मैं टुपल्स के बारे में क्यों लिखूंगा।

टुपल्स को क्यों पसंद किया जाता है?

छोटे tuples के लिए आवंटन अनुकूलन

स्मृति विखंडन को कम करने और आवंटन को गति देने के लिए, पायथन पुराने ट्यूपल्स का पुन: उपयोग करता है। यदि टपल की आवश्यकता नहीं है और इसे हटाने के बजाय 20 से कम आइटम हैं, तो स्थायी रूप से पायथन इसे एक मुफ्त सूची में ले जाता है।

एक निशुल्क सूची को 20 समूहों में विभाजित किया गया है, जहां प्रत्येक समूह 0 और 20 के बीच की लंबाई के tuples की सूची का प्रतिनिधित्व करता है। प्रत्येक समूह 2 000 tuples तक स्टोर कर सकता है। पहले (शून्य) समूह में केवल 1 तत्व होता है और एक खाली ट्यूपल का प्रतिनिधित्व करता है।

>>> a = (1,2,3)
>>> id(a)
4427578104
>>> del a
>>> b = (1,2,4)
>>> id(b)
4427578104

ऊपर के उदाहरण में हम देख सकते हैं कि a और b में एक ही id है। ऐसा इसलिए है क्योंकि हमने तुरंत नष्ट हो चुके टपल पर कब्जा कर लिया था जो कि मुफ्त सूची में था।

सूचियों के लिए आवंटन अनुकूलन

चूंकि सूचियों को संशोधित किया जा सकता है, पायथन ट्यूपल्स में समान अनुकूलन का उपयोग नहीं करता है। हालाँकि, पायथन सूचियों की भी एक निःशुल्क सूची है, लेकिन इसका उपयोग केवल खाली वस्तुओं के लिए किया जाता है। यदि कोई खाली सूची जीसी द्वारा हटा दी जाती है या एकत्र की जाती है, तो इसे बाद में पुन: उपयोग किया जा सकता है।

>>> a = []
>>> id(a)
4465566792
>>> del a
>>> b = []
>>> id(b)
4465566792

स्रोत: https://rushter.com/blog/python-lists-and-tuples/

ट्यूपल्स सूचियों की तुलना में कुशल क्यों हैं? -> https://stackoverflow.com/a/22140115


2

5.3 पर प्रलेखन से एक दिशा उद्धरण टुपल्स और अनुक्रम :

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


1

सबसे पहले, वे दोनों पायथन में गैर-स्केलर ऑब्जेक्ट (एक यौगिक ऑब्जेक्ट के रूप में भी जाना जाता है) हैं।

  • टुपल्स, तत्वों का अनुक्रम (जिसमें कोई भी वस्तु शामिल हो सकती है जिसमें कोई समस्या नहीं है)
    • अपरिवर्तनीय (टपल, इंट, फ्लोट, स्ट्र)
    • कॉनटेनटेशन इस् यूज़िंग +(एकदम नया टपल बनाया जाएगा)
    • इंडेक्सिंग
    • टुकड़ा करने की क्रिया
    • के (3,) # -> (3)बजाय सिंगलटन(3) # -> 3
  • सूची (अन्य भाषाओं में सरणी), मूल्यों के अनुक्रम का आदेश दिया
    • परिवर्तनशील
    • एकाकी वस्तु [3]
    • क्लोनिंग new_array = origin_array[:]
    • सूची की समझ [x**2 for x in range(1,7)]आपको देता है [1,4,9,16,25,36](पठनीय नहीं)

सूची का उपयोग करने से एक एलियासिंग बग (एक ही वस्तु को इंगित करने वाले दो अलग-अलग पथ) हो सकता है।


0

सूचियाँ उत्परिवर्तनीय हैं और टुपल्स अपरिवर्तनीय हैं। इस उदाहरण पर विचार करें।

a = ["1", "2", "ra", "sa"]    #list
b = ("1", "2", "ra", "sa")    #tuple

अब सूची और टपल के सूचकांक मूल्यों को बदलें।

a[2] = 1000
print a     #output : ['1', '2', 1000, 'sa']
b[2] = 1000
print b     #output : TypeError: 'tuple' object does not support item assignment.

इसलिए साबित हुआ कि निम्न कोड टपल के साथ अमान्य है, क्योंकि हमने एक टपल को अपडेट करने का प्रयास किया, जिसकी अनुमति नहीं है।


-1

सूची परिवर्तनशील है और टुपल्स अपरिवर्तनीय है। जब आप किसी आइटम को जोड़ने की कोशिश कर रहे हैं, तो परिवर्तनशील और अपरिवर्तनीय के बीच मुख्य अंतर मेमोरी उपयोग है।

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

हालांकि, यदि आप जानते हैं कि आप अक्सर नए तत्व नहीं जोड़ रहे हैं, तो आपको ट्यूपल्स का उपयोग करना चाहिए। Tuples आवश्यक मेमोरी के आकार को असाइन करता है, और इसलिए मेमोरी को बचाता है, खासकर जब आप मेमोरी के बड़े ब्लॉक का उपयोग करते हैं।


2
जबकि उस में से कुछ तकनीकी रूप से सच है, यह वास्तव में उत्परिवर्तनीय और अपरिवर्तनीय प्रकारों के बीच महत्वपूर्ण अंतर नहीं है। बड़ा अंतर यह है कि उत्परिवर्तनीय प्रकारों को निर्माण के बाद बदला जा सकता है, जबकि अपरिवर्तनीय प्रकारों में नहीं।
रोजर फैन

1
इसीलिए ऐसा नहीं है। मेमोरी और म्यूटेबिलिटी का एक दूसरे से कोई लेना-देना नहीं है। यह केवल सूचियों के लिए एक कार्यान्वयन विवरण है। मेमोरी को वेरिएबल्स को भी नहीं सौंपा गया है, इसे ऑब्जेक्ट्स को सौंपा गया है। चर तब सिर्फ उन वस्तुओं के संदर्भ हैं।
रोजर फैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.