python - पायथन: रेंज त्रुटि से सूची सूचकांक



3 Answers

अभिव्यक्ति len(l) का मूल्यांकन केवल एक बार किया जाता है, इस समय range() बिल्टिन का मूल्यांकन किया जाता है। उस समय निर्मित श्रेणी वस्तु बदलती नहीं है; यह ऑब्जेक्ट l बारे में कुछ भी नहीं जानता है।

पीएस l एक मूल्य के लिए एक उग्र नाम है! यह संख्या 1, या पूंजी पत्र I की तरह दिखता है।

python list

मैंने एक साधारण पायथन कार्यक्रम लिखा है

l=[1,2,3,0,0,1]
for i in range(0,len(l)):
       if l[i]==0:
           l.pop(i)

यह मुझे लाइन पर 'श्रेणी से बाहर सूची सूचकांक' त्रुटि देता है if l[i]==0:

डिबगिंग के बाद मैं समझ सकता था कि i वृद्धि हो रही है और सूची कम हो रही है।
हालांकि, मेरे पास लूप समाप्ति की स्थिति है i < len(l) । तो मुझे ऐसी त्रुटि क्यों मिल रही है?




मार्क रशकॉफ ने क्या कहा है, लेकिन यदि आप विपरीत दिशा में पुनरावृत्त करते हैं, तो फॉर-लूप में सूची के तत्वों को भी हटा देना संभव है। उदाहरण के लिए,

x = [1,2,3,0,0,1]
for i in range(len(x)-1, -1, -1):
    if x[i] == 0:
        x.pop(i)

यह एक ऊंची इमारत की तरह है जो ऊपर से नीचे तक गिरता है: भले ही यह पतन के बीच में हो, फिर भी आप इसमें "प्रवेश" कर सकते हैं और अभी तक गिरने वाले फर्श पर जा सकते हैं।




सूची की समझ आपको समाधान के लिए ले जाएगी।

लेकिन अजगर में ऑब्जेक्ट की प्रतिलिपि बनाने का सही तरीका पाइथन मॉड्यूल कॉपी - शैलो और गहरी प्रतिलिपि संचालन का उपयोग कर रहा है।

l=[1,2,3,0,0,1]
for i in range(0,len(l)):
   if l[i]==0:
       l.pop(i)

अगर इसके बजाय,

import copy
l=[1,2,3,0,0,1]
duplicate_l = copy.copy(l)
for i in range(0,len(l)):
   if l[i]==0:
       m.remove(i)
l = m

फिर, आपका स्वयं का कोड काम करेगा। लेकिन अनुकूलन के लिए, सूची समझ एक अच्छा समाधान है।




Related


Tags

python   list