क्या पायथन सूची में अपने तत्वों को उस क्रम में रहने की गारंटी दी गई है जिस क्रम में उन्हें डाला गया है?


318

यदि मेरे पास निम्न पायथन कोड है

>>> x = []
>>> x = x + [1]
>>> x = x + [2]
>>> x = x + [3]
>>> x
[1, 2, 3]

विल xहमेशा होने की गारंटी हो [1,2,3], या अंतरिम तत्वों की अन्य orderings संभव हो रहे हैं?

जवाबों:


479

हाँ, एक अजगर सूची में तत्वों का क्रम लगातार है।


17
यह सही उत्तर है इसलिए मैं दूसरा जोड़ना नहीं चाहता। वह भी सूची का उपयोग कर सकता है। docs.python.org/2/tutorial/datastructures.html
NG।

1
क्या होगा अगर मैं किसी फ़ंक्शन से स्थानीय सूची लौटाता हूं और कॉलिंग फ़ंक्शन में इसका उपयोग करता हूं। यह है def fn_1(): lst = [] lst.append(1) lst.append(2) return lstऔर def fn_2(): print(fn_1())क्या आदेश कभी भी या कितनी बार मैं fn_1 () का उपयोग करने के बावजूद एक ही हो सकता हूं?
द क्यूरियसऑन

6
हाँ, एक अजगर सूची में तत्वों का क्रम लगातार है। ;)
sge

82

संक्षेप में, हाँ, आदेश संरक्षित है। लंबे समय में:

सामान्य तौर पर निम्नलिखित परिभाषाएँ हमेशा सूची जैसी वस्तुओं पर लागू होंगी:

एक सूची तत्वों का एक संग्रह है जिसमें डुप्लिकेट तत्व शामिल हो सकते हैं और एक परिभाषित आदेश है जो आमतौर पर तब तक नहीं बदलता है जब तक कि स्पष्ट रूप से ऐसा करने के लिए नहीं किया जाता है। स्टैक और कतारें दोनों प्रकार की सूचियां हैं जो तत्वों को जोड़ने और हटाने के लिए विशिष्ट (अक्सर सीमित) व्यवहार प्रदान करती हैं (स्टैक एलआईएफओ, क्वीन्स एफआईएफओ होने के कारण)। सूचियाँ, चीज़ों की सूचियों का, व्यावहारिक रूप से प्रतिनिधित्व करती हैं। एक स्ट्रिंग को पात्रों की एक सूची के रूप में सोचा जा सकता है, क्योंकि आदेश महत्वपूर्ण है ( "abc" != "bca") और स्ट्रिंग की सामग्री में डुप्लिकेट निश्चित रूप से अनुमत हैं ( "aaa"मौजूद हो सकते हैं और != "a")।

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

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

यह नामकरण योजना उन सभी प्रोग्रामिंग भाषाओं के लिए सही है, जिन्हें मैं जानता हूं, जिनमें पायथन, सी ++, जावा, सी #, और लिस्प (जिसमें उनके क्रम को विशेष रूप से आपत्तिजनक नहीं रखा जाएगा सूची शामिल है)। यदि किसी को किसी भी तरह का पता है जहां यह मामला नहीं है, तो कृपया बस इतना कहें और मैं अपना जवाब संपादित करूंगा। ध्यान दें कि विशिष्ट कार्यान्वयन इन ऑब्जेक्ट्स के लिए अन्य नामों का उपयोग कर सकते हैं, जैसे कि C ++ में वेक्टर और ALGOL 68 में फ्लेक्स (दोनों सूचियाँ; फ्लेक्स तकनीकी रूप से सिर्फ एक पुन: प्रयोज्य सरणी है)।

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

अगर हमारे पास है

list1 = [0, 1, 2, 3, 4]
list2 = [5, 6, 7, 8, 9]

फिर

list1 + list2

के समान है

[0, 1, 2, 3, 4] + [5, 6, 7, 8, 9]

जिसका मूल्यांकन करता है

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

बहुत पसंद

"abdcde" + "fghijk"

का उत्पादन

"abdcdefghijk"

1
मैंने कहीं पढ़ा है कि चूंकि JSON सरणी का विनिर्देश यह निर्दिष्ट नहीं करता है कि सरणियाँ ऑर्डर सरणी बनाए रखती हैं इसलिए ऑर्डर बनाए रखने के लिए गारंटी नहीं दी जाती है। मैं उस के लिए स्रोत नहीं मिल सकता है, यद्यपि। और एरे की अंतर्निहित संरचना अभी भी गिने हुए अनुक्रमित के साथ एक वस्तु का एक विशेष मामला है, इसलिए यह आपके कथन के विपरीत नहीं है, बस एक दिलचस्प tidbit है, मैंने सोचा।
मल्टीहंटर

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

1
@Pintun इस पोस्ट को लिखने के कई साल बाद मैं आपसे सहमत हूँ। एक बार मैं संपादित करूँगा कि मैं जो लक्ष्य कर रहा था, उसे व्यक्त करने का बेहतर तरीका समझूँ।
ApproachingDarknessFish

5

आप 'सेट' और 'सूची' को भ्रमित कर रहे हैं। एक सेट आदेश की गारंटी नहीं देता है, लेकिन सूचियाँ करता है।

सेट घुंघराले ब्रैकेट का उपयोग करके घोषित किए जाते हैं {}:। इसके विपरीत, वर्गाकार कोष्ठक का उपयोग करके सूचियाँ घोषित की जाती हैं []:।

mySet = {a, b, c, c}

आदेश की गारंटी नहीं देता है, लेकिन सूची इस प्रकार है:

myList = [a, b, c]

1
ध्यान दें कि एक सेट भी दोहराव की गारंटी देता है। एक सूची में डुप्लिकेट तत्व हो सकते हैं, एक सेट नहीं हो सकता है।
नथानिएल फोर्ड

4

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

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

>>> a = [[1], [2], [3]]
>>> a[0].append(7)
>>> a
[[1, 7], [2], [3]]

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

यह भी है कि बाहर की ओर इशारा करते लायक है x = x + [a]और x.append(a)एक ही बात नहीं कर रहे हैं। दूसरा एक म्यूटेट करता है x, और पहला व्यक्ति एक नई सूची बनाता है और इसे असाइन करता है x। अंतर देखने के लिए, y = xकुछ भी जोड़ने xऔर हर एक को आज़माने से पहले सेटिंग का प्रयास करें , और उन दोनों के अंतर को देखें y


0

alist = [1,2,3]

मैं = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

एक सूचि

[2]

नैतिक जब सूची से संचालित पाश में किसी सूची को संशोधित करता है, तो दो चरण होते हैं:

aList=[1,2,3]
i=0
for item in aList:
    if i<2:
        aList[i]="del"
    i+=1

aList

['del', 'del', 3]
for i in range(2):
    del aList[0]

aList
[3]

0

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


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