Skip to content
This page has been auto-translated and may contain errors.View in English

लिस्ट्स

docs.scrimba.com

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

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

एक list Python का गतिशील सरणी है: एक क्रमबद्ध, म्यूटेबल (जगह में परिवर्तनीय) अनुक्रम। प्रदर्शन प्रोफ़ाइल डिज़ाइन निर्णयों को चलाती है। इंडेक्स से पढ़ना O(1) है, स्थिर समय चाहे लिस्ट कितनी भी बड़ी हो (big-O आकार के साथ लागत कैसे मापता है, n के लिए शॉर्टहैंड है)। append() भी प्रभावी रूप से O(1) है: लिस्ट अंत में अतिरिक्त स्थान रखती है और कभी-कभी ही आकार बदलती है। जो लागतें काटती हैं वह insert() और remove() हैं O(n) पर, क्योंकि परिवर्तन बिंदु के बाद हर तत्व स्थानांतरित होता है। जब आप एक लूप में सामने डालना या हटाना करते हुए पाते हैं, तो वह O(n) एक अलग संरचना के लिए पहुंचने का संकेत है।

एक लिस्ट बनाना

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

लिस्ट्स ब्रैकेट सिंटैक्स के साथ परिभाषित हैं और प्रविष्टि क्रम को संरक्षित करते हैं। वे किसी भी Python मान को रख सकते हैं, दूसरी लिस्ट्स सहित। खाली लिस्ट [] वह मानक शुरुआती बिंदु है जब आप वस्तुओं को धीरे-धीरे जमा करते हैं।

एक ब्रैकेट लिटरल एक नई list ऑब्जेक्ट बनाता है, और लिस्ट अपने तत्वों के संदर्भ को स्टोर करती है, कॉपी किए गए मानों को नहीं (एक संदर्भ उस स्थान का एक पॉइंटर है जहां वास्तविक ऑब्जेक्ट रहता है)। तो एक तत्व कोई भी Python ऑब्जेक्ट हो सकता है, दूसरी लिस्ट सहित। एक लिस्ट में प्रकारों को मिलाना मान्य है लेकिन त्वरित स्क्रिप्ट्स के बाहर असामान्य है: अधिकांश लिस्ट्स जो आप रखते हैं वह एक प्रकार रखते हैं, जो उन्हें समझने और एक लूप में प्रक्रिया करने में आसान बनाता है।

python
scores = [87, 92, 74, 65, 91]
players = ["राज", "प्रिया", "अमित"]
mixed = ["राज", 87, True, 3.14]   # कोई भी प्रकार, हालांकि असामान्य
empty = []
Junoएक लिस्ट बनाना स्क्वायर ब्रैकेट के बीच मान, अल्पविरामों से अलग किए गए, और Python उन्हें उसी क्रम में रखता है जिस क्रम में आपने लिखा था। एक खाली [] एक सही शुरुआती बिंदु है जब आप इसे भरने की योजना बनाते हैं जैसे-जैसे आप जाते हैं। मेरी अधिकांश लिस्ट्स इसी तरह शुरू होती हैं, खाली और प्रतीक्षा में।
Junoएक लिस्ट बनाना ब्रैकेट एक लिस्ट को परिभाषित करते हैं और प्रविष्टि क्रम संरक्षित होता है। एक लिस्ट किसी भी मान को रख सकती है, दूसरी लिस्ट सहित, और [] वह मानक शुरुआत है जब आप धीरे-धीरे आइटम जमा करते हैं।
Junoएक लिस्ट बनाना एक लिस्ट अपने तत्वों के संदर्भ रखती है, तो यह किसी भी वस्तुओं को मिश्रित कर सकती है, हालांकि आप वास्तव में रखना चाहते हैं एक प्रकार प्रति लिस्ट। [] तक पहुंचें और बनाएं, अतिरिक्त आवंटन यह सस्ता बनाता है।

इंडेक्सिंग और स्लाइसिंग

लिस्ट्स स्ट्रिंग्स के समान नंबरिंग का उपयोग करते हैं: पॉजीशन 0 से शुरू होते हैं, नकारात्मक संख्याएं अंत से गिनती करते हैं। आप किसी भी आइटम को इसकी पॉजीशन से पढ़ते हैं। क्योंकि लिस्ट्स म्यूटेबल हैं, आप किसी विशिष्ट पॉजीशन में लिख भी सकते हैं।

लिस्ट इंडेक्सिंग और स्लाइसिंग स्ट्रिंग्स के समान नियमों का पालन करते हैं। मुख्य अंतर म्यूटेबिलिटी है: आप आइटम्स को जगह पर बदलने के लिए एक इंडेक्स या एक स्लाइस को असाइन कर सकते हैं, कुछ स्ट्रिंग्स करने की अनुमति नहीं देते।

इंडेक्सिंग और स्लाइसिंग स्ट्रिंग पर समान पढ़ते हैं, लेकिन एक लिस्ट आपको भी असाइन करने देती है, क्योंकि यह म्यूटेबल है। जानने वाला: स्लाइस असाइनमेंट: यह लिस्ट की लंबाई को बदल सकता है। lst[1:3] = [10, 20, 30] पॉजीशन 1 और 2 पर दो आइटम्स को तीन नए से बदलता है, लिस्ट को एक से बढ़ाता है। प्रतिस्थापन स्लाइस की लंबाई से मेल नहीं खाना है, जो सुविधाजनक है और एक सामान्य आश्चर्य है, इसलिए इसे दुर्घटना से बजाय जानबूझकर के लिए पहुंचें।

python
scores = [87, 92, 74, 65, 91]

scores[0]      # 87  (पहला)
scores[-1]     # 91  (अंतिम)
scores[1:3]    # [92, 74]
scores[:2]     # [87, 92]
scores[::-1]   # [91, 65, 74, 92, 87]  (उलट)

scores[0] = 90   # म्यूटेबल: काम करता है (स्ट्रिंग्स TypeError उठाती हैं)
Junoइंडेक्सिंग और स्लाइसिंग पॉजीशन 0 से शुरू होते हैं, और नकारात्मक संख्याएं अंत से पीछे की ओर गिनती करते हैं, इसलिए scores[-1] अंतिम एक है। एक स्लाइस जैसे scores[1:3] आपको पॉजीशन 1 और 2 के साथ एक ताज़ी लिस्ट देता है। जो भाग मेरे लिए एक पल का था: एक लिस्ट के साथ आप एक पॉजीशन में भी लिख सकते हैं, scores[0] = 90, जहां एक स्ट्रिंग इंकार करती।
Junoइंडेक्सिंग और स्लाइसिंग स्ट्रिंग्स जैसी इंडेक्सिंग और स्लाइसिंग, 0 से पॉजीशन, अंत से नकारात्मक। अंतर म्यूटेबिलिटी है: एक इंडेक्स या स्लाइस को असाइन करें और आप लिस्ट को जगह पर बदलते हैं, जहां एक स्ट्रिंग TypeError उठाती।
Junoइंडेक्सिंग और स्लाइसिंग स्ट्रिंग इंडेक्सिंग की तरह पढ़ता है, लेकिन आप असाइन कर सकते हैं, और स्लाइस असाइनमेंट लिस्ट को आकार बदल सकता है। lst[1:3] = [10, 20, 30] दो आइटम्स को तीन के लिए स्वैप करता है, जानबूझकर हाथ में और दुर्घटना से आश्चर्य, इसलिए इसे जानबूझकर के लिए पहुंचें।

आइटम्स जोड़ना

आइटम्स जोड़ने के लिए तीन तरीके। append() अंत में एक आइटम जोड़ता है और वह है जो आप लगभग हर समय उपयोग करेंगे। insert() एक विशिष्ट पॉजीशन पर जोड़ता है। extend() एक और लिस्ट को विलय करता है।

append() O(1) के प्रति सेकंड है (लिस्ट अतिरिक्त स्थान रखती है और कभी-कभी ही आकार बदलती है, इसलिए औसत लागत स्थिर रहती है) और एक लिस्ट को एक आइटम एक बार में बनाने का मानक तरीका है। insert() O(n) है क्योंकि यह बाद के तत्वों को स्थानांतरित करता है। extend() += के बराबर है और एक लूप में दोहराए गए append() की तुलना में अधिक कुशल है।

append() सस्ता है क्योंकि लिस्ट अतिरिक्त स्थान रखती है और कभी-कभी ही आकार बदलती है, इसलिए औसत लागत O(1) रहती है (स्थिर, लंबाई की परवाह किए बिना)। insert(0, x) जाल है: सामने पर सम्मिलित करना O(n) है क्योंकि हर तत्व दाईं ओर एक स्लॉट को स्थानांतरित करता है। यदि आप सामने में बार-बार जोड़कर एक लिस्ट बनाते हैं, तो वह O(n वर्ग) में बदल जाता है। जब आपको तेज़ सामने सम्मिलन की आवश्यकता हो, तो मानक पुस्तकालय से collections.deque का उपयोग करें, जिसका appendleft O(1) है, मॉड्यूल्स अध्याय में कवर किया गया। extend() एक पास में लिस्ट को बढ़ाता है, यही कारण है कि यह append() कॉल्स के लूप को हराता है जब आपके पास पहले से ही आइटम्स हैं।

python
scores = [87, 92, 74]

scores.append(65)          # [87, 92, 74, 65]
scores.insert(1, 100)      # [87, 100, 92, 74, 65]
scores.extend([55, 71])    # [87, 100, 92, 74, 65, 55, 71]

एक सामान्य गलती: append() के साथ एक लिस्ट पूरी लिस्ट को एक आइटम के रूप में जोड़ता है, जो आपको एक लिस्ट के अंदर एक लिस्ट देता है। इसके बजाय extend() का उपयोग करें:

append(x) हमेशा x को एक एकल तत्व के रूप में जोड़ता है। append() को एक लिस्ट पास करना आपको एक नेस्टेड लिस्ट देता है। जब आप इस लिस्ट में किसी और लिस्ट से सभी आइटम्स को विलय करना चाहते हैं तो extend() का उपयोग करें:

append(x) एक तत्व के रूप में x जोड़ता है चाहे x क्या हो, तो उसे एक लिस्ट देना उस लिस्ट को पूरा नेस्ट करता है। extend(iterable) तर्क को चलाता है और हर तत्व को अलग से जोड़ता है। lst += other extend के समान काम करता है, तो जो भी कॉल साइट पर स्पष्ट रूप से पढ़े वह पहुंचें।

python
scores.append([55, 71])    # [..., [55, 71]]  नेस्टेड लिस्ट, संभवतः गलत
scores.extend([55, 71])    # [..., 55, 71]    विलय, सही
Junoआइटम्स जोड़नाappend() अंत में एक आइटम को टैक करता है और वह है जो आप लगभग हर समय पहुंचेंगे। insert() एक पॉजीशन पर एक आइटम डालता है, extend() एक और लिस्ट को विलय करता है। क्लासिक स्लिप: append() एक लिस्ट और आप अपनी लिस्ट के अंदर एक लिस्ट पाते हैं, तो विलय करने का मतलब extend() का उपयोग करें।
Junoआइटम्स जोड़नाappend() आपका डिफ़ॉल्ट है, एक बार में अंत में आइटम। insert() इसके बाद सब कुछ स्थानांतरित करता है, तो यह अधिक लागत करता है। append() एक लिस्ट और यह नेस्ट करता है; extend() (या +=) आइटम्स को इसके बजाय विलय करता है।
Junoआइटम्स जोड़नाappend() प्रति सेकंड O(1) है, insert(0, x) O(n) है, तो एक लूप में सामने से आकार बदलकर शांत रूप से द्विघात चला जाता है, वहां deque तक पहुंचें। और append() एक लिस्ट इसे पूरा नेस्ट करता है; extend() या += विलय है।

आइटम्स हटाना

आइटम्स हटाने के लिए चार उपकरण। remove() मान से खोज करता है। pop() पॉजीशन से हटाता है और आपको आइटम वापस देता है। del पॉजीशन से हटाता है कोई रिटर्न वैल्यू के बिना। clear() पूरी लिस्ट को खाली कर देता है।

remove() O(n) है: यह मान से पहली घटना के लिए स्कैन करता है। pop() कोई तर्क नहीं के साथ अंतिम आइटम के लिए O(1) है। pop(i) किसी और पॉजीशन के लिए O(n) है क्योंकि तत्व स्थानांतरित होते हैं। del scores[i] pop(i) के बराबर है लेकिन रिटर्न वैल्यू को छोड़ देता है।

remove(value) आगे की ओर स्कैन करता है हर तत्व की तुलना करते हुए जब तक वह एक मेल न पाए, फिर इसके बाद सब कुछ बाईं ओर स्थानांतरित करता है: O(n) (लागत लिस्ट की लंबाई के साथ बढ़ता है)। pop() अंत से O(1) है, कोई स्थानांतर नहीं होता। pop(i) कहीं और O(n) है उसी स्थानांतरण कारण के लिए। यदि आप एक गर्म लूप में मनमानी पॉजीशन से हटाते हुए पाते हैं, तो वह दोहराया O(n) डेटा को पुनर्संरचित करने या एक अलग संग्रह उठाने का संकेत है।

python
scores = [87, 92, 74, 65, 91]

scores.remove(74)    # 74 की पहली घटना को हटाता है
scores.pop()         # अंतिम आइटम को हटाता है और रिटर्न करता है (91)
scores.pop(0)        # पॉजीशन 0 पर आइटम को हटाता है और रिटर्न करता है (87)
del scores[1]        # पॉजीशन 1 को हटाता है, कोई रिटर्न वैल्यू नहीं
scores.clear()       # सब कुछ हटाता है

remove() एक ValueError उठाता है यदि मान लिस्ट में नहीं है। पहले in के साथ जांचें यदि आप निश्चित नहीं हैं:

python
if 74 in scores:
    scores.remove(74)

remove() एक मिस पर ValueError उठाता है। in चेक एक अतिरिक्त O(n) स्कैन जोड़ता है, तो आप लिस्ट को दोबारा चलाते हैं। एक बार की कोड के लिए यह ठीक है। जब आप इसे पूर्व-जांच करने के बजाय विफलता को पकड़ना पसंद करेंगे, तो try / except ValueError फाइलें और अपवाद अध्याय में कवर की गई है।

in फिर remove() पैटर्न दो O(n) स्कैन है, लिस्ट दोबारा चला। जब क्रम महत्वपूर्ण नहीं है, लक्ष्य को अंतिम तत्व के साथ स्वैप करना और इसे पॉप करना O(1) है (स्थिर लागत, कोई स्थानांतर नहीं)। और यदि आप सदस्यता को बहुत कुछ परीक्षण कर रहे हैं, तो एक set O(1) में लुकअप करता है जहां एक लिस्ट O(n) है, टुपल्स और सेट्स अध्याय में कवर किया गया। नियम का अंगूठा: एक लिस्ट क्रमबद्ध, बदलती हुई डेटा के लिए, एक सेट क्षण "यह वहां है" गर्म सवाल है।

Junoआइटम्स हटानाremove() मान से हटाता है और केवल पहली मेल, और यह `ValueError` उठाता है यदि मान वहां नहीं है, तो पहले `in` के साथ जांचें जब आप निश्चित नहीं हैं। pop() पॉजीशन से हटाता है और आइटम वापस देता है, del पॉजीशन से हटाता है और आपको कुछ नहीं देता।
Junoआइटम्स हटानाremove() पहली मान मेल को हटाता है और एक मिस पर `ValueError` उठाता है। `pop()` अंत से सस्ता है और आइटम रिटर्न करता है; `pop(i)` कहीं और इसके बाद सब कुछ स्थानांतरित करता है। `del` पॉजीशन से हटाता है, कोई रिटर्न।
Junoआइटम्स हटानाremove() और `pop(i)` अंत के दूर O(n) स्थानांतर हैं; केवल `pop()` टेल O(1) से है। यदि "यह वहां है" गर्म पथ है, तो एक `set` O(1) में करता है जहां लिस्ट O(n) है। `remove()` से पहले `in` के साथ पूर्व-जांच लिस्ट को दोबारा चलाता है।

सॉर्ट करना

sorted() एक ब्रांड नई सॉर्ट की गई लिस्ट रिटर्न करता है और आपकी मूल को अकेला छोड़ देता है। .sort() लिस्ट को जगह पर सॉर्ट करता है और None रिटर्न करता है। वह अंतर सुनाई देने से अधिक मायने रखता है।

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

Python की सॉर्ट स्थिर है: समान तत्व अपने मूल सापेक्ष क्रम को रखते हैं। यह है जो आपको एक कुंजी से सॉर्ट करने देता है, फिर दूसरे द्वारा फिर से सॉर्ट करता है, और पहला क्रमन टाई-ब्रेकर के रूप में जीवित रहता है। यह लगभग-सॉर्ट किए गए डेटा पर भी तेज़ है, स्क्रैच से सॉर्ट के O(n log n) की तुलना में O(n) (लीनियर) के करीब, तो एक मुख्यतः-क्रमबद्ध लिस्ट को फिर से सॉर्ट करना सस्ता है। .sort() जानबूझकर None रिटर्न करता है: एक तरीका जो लिस्ट को जगह पर बदलता है यह भी रिटर्न नहीं करता है, जो सम्मेलन है जो आपको x = lst.sort() लिखने से रोकता है और शांत रूप से None पाता है। sorted() किसी भी पुनरावृत्तीय को लेता है, केवल लिस्ट्स नहीं, और हमेशा एक ताज़ी लिस्ट रिटर्न करता है।

python
scores = [87, 42, 96, 55, 71]

ranked = sorted(scores)            # [42, 55, 71, 87, 96] (नई लिस्ट)
scores.sort()                      # जगह पर सॉर्ट करता है, None रिटर्न करता है
scores.sort(reverse=True)          # [96, 87, 71, 55, 42]

result = scores.sort()             # result None है, सॉर्ट की गई लिस्ट नहीं
Junoसॉर्ट करनाsorted() आपको एक नई सॉर्ट की गई लिस्ट देता है और मूल को अकेला छोड़ता है। .sort() लिस्ट को पुनर्व्यवस्थित करता है और `None` रिटर्न करता है, तो `x = scores.sort()` आपको `None` के साथ देता है, लिस्ट नहीं। मैंने वह सटीक गलती एक से अधिक बार की थी इससे पहले कि यह अटका।
Junoसॉर्ट करनाsorted() सुरक्षित डिफ़ॉल्ट है, यह कभी मूल को नहीं छूता। .sort() जगह पर सॉर्ट करता है और `None` रिटर्न करता है, तो इसके परिणाम को असाइन करना जाल है याद रखने के लिए। जब आपको मूल बरकरार चाहिए तो `sorted()` पहुंचें।
Junoसॉर्ट करना सॉर्ट स्थिर है, तो पहले माध्यमिक कुंजी से सॉर्ट करें, फिर प्राथमिक, और टाई उनकी पहली क्रमन रखते हैं। यह लगभग-सॉर्ट किए गए डेटा पर नियर-लीनियर चलाता है, तो फिर से सॉर्ट करना सस्ता है। .sort() डिज़ाइन द्वारा `None` रिटर्न करता है; sorted() किसी भी पुनरावृत्तीय लेता है और एक नई लिस्ट रिटर्न करता है।

उपयोगी संचालन

Python में अंतर्निहित उपकरणों का एक सेट है जो सीधे लिस्ट्स पर काम करता है। len(), sum(), min(), और max() चार हैं जो आप लगातार पहुंचेंगे।

अंतर्निहित अनुक्रम कार्य किसी भी लिस्ट पर काम करते हैं। in लिस्ट्स के लिए एक रैखिक स्कैन है; यदि आपको तेज़ दोहराई गई सदस्यता परीक्षाओं की आवश्यकता है, तो एक सेट में बदलें। .index() यदि मान नहीं पाया गया तो ValueError उठाता है।

len(), sum(), min(), और max() किसी भी पुनरावृत्तीय पर काम करते हैं, केवल लिस्ट्स नहीं, तो वही कॉल एक लिस्ट, एक टुपल, या एक जनरेटर पढ़ता है। लागत नोट जो मायने रखता है: in और .index() दोनों आगे की ओर स्कैन करते हैं, O(n) (लागत लंबाई के साथ बढ़ता है), क्योंकि एक लिस्ट के पास अपनी सामग्री का कोई इंडेक्स नहीं है। एक लूप में दोहराई गई सदस्यता जांचें जहां वह जोड़ता है, और एक set सुधार है। एक तीव्र किनारा: sum() 0 से शुरू होता है, तो यह संख्याएं जोड़ता है, स्ट्रिंग्स नहीं; स्ट्रिंग्स को जोड़ने के लिए "".join() का उपयोग करें, स्ट्रिंग्स अध्याय में कवर किया गया।

python
scores = [87, 92, 74, 65, 91]

len(scores)          # 5
sum(scores)          # 409
min(scores)          # 65
max(scores)          # 92
scores.count(87)     # 1
scores.index(74)     # 2
74 in scores         # True
74 not in scores     # False
scores.copy()        # उथली प्रति
scores.reverse()     # जगह पर उलटता है
Junoउपयोगी संचालनlen(), sum(), min(), और max() सब सीधे एक लिस्ट पर काम करते हैं, कोई सेटअप नहीं। in पूछता है कि कुछ मौजूद है, .count() कितनी बार तालिका करता है, और .index() पहली मेल की पॉजीशन पाता है।
Junoउपयोगी संचालन अंतर्निहित कार्य किसी भी लिस्ट पर काम करते हैं, और अनुक्रम वाले किसी भी पुनरावृत्तीय पर काम करते हैं। `in` एक रैखिक स्कैन है, तो दोहराई गई सदस्यता परीक्षाओं के लिए एक सेट में बदलें। `.index()` जब मान नहीं पाया गया तो `ValueError` उठाता है।
Junoउपयोगी संचालनlen(), sum(), min(), max() किसी भी पुनरावृत्तीय लेते हैं, केवल लिस्ट्स नहीं। `in` और `.index()` दोनों O(n) स्कैन हैं, तो एक गर्म सदस्यता जांच एक `set` चाहती है। और `sum()` `0` से शुरू होता है, तो स्ट्रिंग्स के लिए `"".join()` तक पहुंचें।

पुनरावृत्ति

एक for लूप एक लिस्ट से होकर एक बार में एक आइटम जाता है। for के बाद वेरिएबल हर बार में वह आइटम प्राप्त करता है। जब आपको पॉजीशन भी चाहिए, enumerate() आपको बिना मैनुअल काउंटर के दोनों देता है।

for item in list लिस्ट के पुनरावृत्तीय को आमंत्रित करता है और हर चरण पर इसे आगे बढ़ाता है। enumerate(iterable, start=0) पुनरावृत्तीय को लपेटता है और (index, value) जोड़े को उपजबद्ध करता है। enumerate() का उपयोग करना एक हाथ से लिखी गई काउंटर वेरिएबल को बनाए रखने से अधिक स्वच्छ और कम त्रुटि-प्रवण है।

enumerate() लूप करते समय (index, value) जोड़े को उपजबद्ध करता है, यही कारण है कि for i, item in enumerate(...) स्वच्छ रूप से पढ़ता है: हर जोड़ी दो नामों में अनपैक करता है। start तर्क केवल प्रदर्शन के लिए काउंटर को स्थानांतरित करता है (तो start=1 एक से संख्या दे रहा है) बिना जहां लूप वास्तव में लिस्ट में पढ़ता है को बदले। इसे हाथ से लिखी गई काउंटर के ऊपर पसंद करने का कारण गति नहीं है, यह है कि एक अलग काउंटर जो आप हाथ से बढ़ाते हैं वह एक और चीज़ है भूलना है, और enumerate() ड्रिफ्ट नहीं हो सकता।

python
players = ["राज", "प्रिया", "अमित"]

for player in players:
    print(player)

for i, player in enumerate(players, start=1):
    print(f"{i}. {player}")
# 1. राज
# 2. प्रिया
# 3. अमित

for और enumerate() को पूरा उपचार नियंत्रण प्रवाह अध्याय में मिलता है। संक्षिप्त संस्करण: for player in players हर आइटम के लिए एक बार चलाता है, और enumerate() हर पुनरावृत्ति पर आपको पॉजीशन और मान दोनों देता है।

Junoपुनरावृत्ति एक for लूप लिस्ट को एक बार में एक आइटम चलता है, और for के बाद नाम हर बार वह आइटम बन जाता है। जब आप पॉजीशन भी चाहते हैं, `enumerate()` आपको दोनों देता है, तो आपको कभी अपने आप काउंटर नहीं रखना है। मुझे इसके लिए गिनती करने देने से ऑफ-बाय-वन स्लिप्स का एक ढेर बचा।
Junoपुनरावृत्तिfor item in list हर आइटम को क्रम में दौरा करता है। `enumerate(iterable, start=0)` `(index, value)` जोड़े को उपजबद्ध करता है, एक काउंटर की तुलना में अधिक स्वच्छ और कम त्रुटि-प्रवण जो आप हाथ से प्रबंधित करते हैं। जब आप एक-आधारित नंबरिंग चाहते हैं तो `start=1` का उपयोग करें।
Junoपुनरावृत्ति `enumerate()` `(index, value)` जोड़े को उपजबद्ध करता है जो सीधे दो नामों में अनपैक करते हैं, और `start` केवल प्रदर्शित काउंटर को स्थानांतरित करता है, पढ़ी पॉजीशन नहीं। जीत गति नहीं है, यह है कि एक मैनुअल काउंटर ड्रिफ्ट हो सकता है और यह एक नहीं हो सकता।

नेस्टेड लिस्ट्स

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

नेस्टेड लिस्ट्स अन्य लिस्ट्स के संदर्भों की लिस्ट्स हैं। हर आंतरिक लिस्ट एक स्वतंत्र ऑब्जेक्ट है। चेन किए गए सबस्क्रिप्ट्स के साथ पहुंचें: grid[row][col]। आंतरिक लिस्ट को म्यूट करना बाहरी लिस्ट को प्रभावित करता है क्योंकि बाहरी लिस्ट उसी ऑब्जेक्ट के संदर्भ को रखती है।

एक नेस्टेड लिस्ट वास्तविक 2D सरणी नहीं है। बाहरी लिस्ट आंतरिक लिस्ट्स के संदर्भ रखती है, हर अपनी स्वतंत्र ऑब्जेक्ट, तो पंक्तियां अलग लंबाई के हो सकते हैं और अलग प्रकार रख सकते हैं। grid[1][2] दो लुकअप हैं: पंक्ति पहुंचें, फिर इसमें अनुक्रम करें। परिणाम जो लोगों को पकड़ता है: बाहरी लिस्ट की एक उथली प्रति (जो .copy() बनाता है) बाहरी कंटेनर को डुप्लिकेट करता है लेकिन अभी भी समान आंतरिक लिस्ट्स की ओर इशारा करता है, तो एक आंतरिक पंक्ति में परिवर्तन दोनों प्रतियों में दिखाई देता है। नीचे म्यूटेबिलिटी अनुभाग उस को ठोस बनाता है।

python
grid = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]

grid[0]       # [1, 2, 3]
grid[1][2]    # 6  (पंक्ति 1, कॉलम 2)
Junoनेस्टेड लिस्ट्स एक लिस्ट अन्य लिस्ट्स को रख सकती है, जो है कि आप एक ग्रिड या तालिका कैसे बनाते हैं: पंक्तियों की एक लिस्ट, हर पंक्ति एक लिस्ट। दो सेट ब्रैकेट अंदर पहुंचता है, `grid[1][2]`, पहला पंक्ति चुनता है, दूसरा इससे चुनता है।
Junoनेस्टेड लिस्ट्स नेस्टेड लिस्ट्स अन्य लिस्ट्स के संदर्भों की लिस्ट्स हैं, हर आंतरिक लिस्ट इसका अपना ऑब्जेक्ट। चेन सबस्क्रिप्ट्स में पहुंचें, `grid[row][col]`। क्योंकि बाहरी लिस्ट केवल संदर्भ रखती है, एक आंतरिक लिस्ट को म्यूट करना इसे इंगित करने वाले हर नाम से दिखाई देता है।
Junoनेस्टेड लिस्ट्स वास्तविक 2D सरणी नहीं: बाहरी लिस्ट संदर्भ रखती है, तो आंतरिक पंक्तियां लंबाई और प्रकार में भिन्न हो सकती हैं, और `grid[1][2]` दो लुकअप हैं। एक उथली प्रति बाहरी लिस्ट को डुप्लिकेट करती है लेकिन आंतरिक को साझा करती है, जो अगला अनुभाग जाल है।

म्यूटेबिलिटी: जाल

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

लिस्ट असाइनमेंट संदर्भ की प्रति है, ऑब्जेक्ट की नहीं। दोनों नाम अंतर्निहित लिस्ट ऑब्जेक्ट की ओर इशारा करते हैं। दोनों नामों के माध्यम से म्यूटेशन समान डेटा को प्रभावित करते हैं। जब आपको स्वतंत्र डेटा चाहिए, .copy(), list(), या एक पूरी स्लाइस [:] के साथ स्पष्ट रूप से कॉपी करें।

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

python
a = [1, 2, 3]
b = a            # b एक प्रति नहीं है; यह समान लिस्ट की ओर इशारा करता है

b.append(4)
print(a)         # [1, 2, 3, 4]  (परिवर्तित: a और b समान लिस्ट हैं)
python
b = a.copy()    # स्वतंत्र प्रति
b = list(a)     # समान परिणाम
b = a[:]        # भी समान

# नेस्टेड लिस्ट्स अभी भी अपनी आंतरिक वस्तुओं को साझा करते हैं:
matrix = [[1, 2], [3, 4]]
copy = matrix.copy()

copy[0].append(99)
print(matrix)   # [[1, 2, 99], [3, 4]]  (आंतरिक लिस्ट साझा थी)

नेस्टेड संरचनाओं के लिए जहां आपको पूर्ण स्वतंत्रता चाहिए, हर आंतरिक लिस्ट को मैनुअल रूप से कॉपी करें, या मानक पुस्तकालय से copy.deepcopy() का उपयोग करें, मॉड्यूल्स अध्याय में कवर किया गया।

Junoम्यूटेबिलिटी: जालb = a एक प्रति नहीं बनाता है, दोनों नाम समान लिस्ट की ओर इशारा करते हैं, तो एक के माध्यम से परिवर्तन दूसरे से दिखता है। एक स्वतंत्र लिस्ट के लिए आपको पूछना है: .copy(), list(a), या a[:]। यह एक लगभग सभी को पहली बार आश्चर्यचकित करता है, मुझे सहित।
Junoम्यूटेबिलिटी: जाल असाइनमेंट संदर्भ की प्रति है, लिस्ट नहीं, तो `b = a` दो नामों को एक ऑब्जेक्ट पर छोड़ता है और दोनों के माध्यम से म्यूटेशन समान डेटा से हिट करते हैं। जब आपको स्वतंत्रता चाहिए तो `.copy()`, `list(a)`, या `a[:]` के साथ स्पष्ट रूप से कॉपी करें।
Junoम्यूटेबिलिटी: जाल `b = a` एक ऑब्जेक्ट साझा करता है; `.copy()` और `a[:]` एक उथली प्रति बनाते हैं, समान आंतरिक संदर्भों पर एक नई बाहरी लिस्ट। अपरिवर्तनीय मानों की सपाट लिस्ट्स उस तरह सुरक्षित हैं, नेस्टेड वाले अपनी पंक्तियों को साझा करते हैं, तो जब आपको अंदर स्वतंत्र भी चाहिए तो `copy.deepcopy()` तक पहुंचें।

अधिक तरीके

विधियह क्या करता है
.append(item)अंत में जोड़ें
.insert(i, item)पॉजीशन i पर सम्मिलित करें
.extend(iterable)पुनरावृत्तीय से सभी आइटम्स जोड़ें
.remove(value)मान की पहली घटना हटाएं
.pop(i)पॉजीशन i पर आइटम हटाएं और रिटर्न करें (डिफ़ॉल्ट: अंतिम)
.clear()सभी आइटम्स हटाएं
.index(value)पहली घटना की पॉजीशन
.count(value)घटनाओं की संख्या
.sort()जगह पर सॉर्ट करें
.reverse()जगह पर उलटें
.copy()एक उथली प्रति रिटर्न करें

व्यवहार में

एक स्कोर ट्रैकर बनाना: परिणाम जोड़ें, उन्हें सॉर्ट करें, और एक सारांश प्रिंट करें।

python
scores = []

scores.append(87)
scores.append(54)
scores.append(92)
scores.append(67)
scores.append(45)

scores.sort(reverse=True)

print(f"रैंक किए गए स्कोर: {scores}")
print(f"उच्चतम: {scores[0]}")
print(f"सबसे कम:  {scores[-1]}")
print(f"औसत: {sum(scores) / len(scores):.1f}")
print(f"शीर्ष 3:   {scores[:3]}")

नामों और स्कोर की दो समानांतर लिस्ट्स: शीर्ष प्रदर्शनकार खोजें और रैंक किए गए परिणाम प्रिंट करें।

python
names = ["राज", "प्रिया", "अमित", "दीक्षा"]
scores = [87, 74, 92, 55]

best_score = max(scores)
best_index = scores.index(best_score)
best_player = names[best_index]

print(f"शीर्ष खिलाड़ी: {best_player} ({best_score})")
print(f"औसत:    {sum(scores) / len(scores):.1f}")

ranked = sorted(scores, reverse=True)
print(f"वितरण (रैंक किया गया): {ranked}")

for rank, score in enumerate(ranked, start=1):
    print(f"  रैंक {rank}: {score}")

एलियासिंग और कॉपी के बीच अंतर को प्रदर्शित करना, और नेस्टेड लिस्ट्स की उथली और गहरी प्रतियों के बीच।

python
# एलियासिंग: b एक प्रति नहीं है
a = [1, 2, 3]
b = a
b.append(4)
print(a)    # [1, 2, 3, 4]  (समान ऑब्जेक्ट)

# उथली प्रति: बाहरी लिस्ट स्वतंत्र है, आंतरिक लिस्ट्स साझा हैं
matrix = [[1, 2, 3], [4, 5, 6]]
shallow = matrix.copy()
shallow[0].append(99)
print(matrix)    # [[1, 2, 3, 99], [4, 5, 6]]  (आंतरिक लिस्ट साझा)

# एक for लूप के साथ मैनुअल गहरी प्रति (कोई आयात की आवश्यकता नहीं)
matrix = [[1, 2, 3], [4, 5, 6]]
deep_copy = []
for row in matrix:
    deep_copy.append(row[:])    # स्पष्ट रूप से हर आंतरिक लिस्ट की प्रति

deep_copy[0].append(99)
print(matrix)    # [[1, 2, 3], [4, 5, 6]]  (अपरिवर्तित)