यह पुनरावृत्ति-सूची-बढ़ते कोड IndexError क्यों देता है: सूची असाइनमेंट सूचकांक को सीमा से बाहर?


194

कृपया निम्नलिखित कोड पर विचार करें:

i = [1, 2, 3, 5, 8, 13]
j = []
k = 0

for l in i:
    j[k] = l
    k += 1

print j

आउटपुट (पायथन 2.6.6 विन 7 32-बिट पर) है:

> Traceback (most recent call last): 
>     j[k] = l IndexError: list assignment index out of range

मुझे लगता है कि यह कुछ सरल है मुझे समझ में नहीं आता है। क्या कोई इसे साफ कर सकता है?


6
appendआपके उपयोग के मामले के लिए सही समाधान है, हालांकि अजगर सूची पर एक सम्मिलित विधि है जो सूची में सीधे i'th स्थिति में सम्मिलित कर सकती है। j.insert(k, l)
उद्घाटन 8

क्या मैं पूछ सकता हूं कि ओपी का समाधान क्यों नहीं होगा? एपेंड का इस्तेमाल क्यों?
हेलन

जवाबों:


317

jएक खाली सूची है, लेकिन आप [0]पहले पुनरावृत्ति में तत्व को लिखने का प्रयास कर रहे हैं , जो अभी तक मौजूद नहीं है।

सूची के अंत में एक नया तत्व जोड़ने के लिए, इसके बजाय निम्नलिखित प्रयास करें:

for l in i:
    j.append(l)

बेशक, यदि आप एक मौजूदा सूची की प्रतिलिपि बनाना चाहते थे, तो आप कभी भी ऐसा नहीं करेंगे। आप बस करेंगे:

j = list(i)

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

i = [1, 2, 3, 5, 8, 13]
j = [None] * len(i)
#j == [None, None, None, None, None, None]
k = 0

for l in i:
   j[k] = l
   k += 1

महसूस करने वाली बात यह है कि कोई listवस्तु आपको किसी ऐसे इंडेक्स के लिए मान प्रदान करने की अनुमति नहीं देगी जो मौजूद नहीं है।


2
ठीक है आपका बहुत बहुत धन्यवाद। मुझे नहीं पता था कि किसकी प्रशंसा करनी चाहिए क्योंकि तीन लगभग एक ही उत्तर हैं। मुझे लगता है कि यह सबसे अधिक वर्णनात्मक है। चीयर्स
व्लादन

मैं देख सकता हूं कि यह PHP या C. j जैसी अन्य भाषाओं से आने वालों के लिए बहुत भ्रमित करने वाला हो सकता है, यह एक प्रकार की सूची है, न कि एक सरणी। सूची प्रकार के साथ, मुझे नहीं लगता कि यह ग्राह्य है। बहुत भ्रामक अगर अन्य भाषाओं से आ रहा है।
नगुई अल

@Nguaial सूची प्रकार सबस्क्रिप्टेबल है, लेकिन आप केवल उन तत्वों तक पहुंच सकते हैं जो पहले से मौजूद हैं - आप किसी ऐसे इंडेक्स को लिखने का प्रयास करके एक तत्व नहीं बना सकते हैं जो सीमा से बाहर हो। j [0] = "foo" काम करेगा यदि सूची में पहले से ही कम से कम एक तत्व है।
स्टीव मेने

52

आपका अन्य विकल्प इनिशियलाइज़ करना है j:

j = [None] * len(i)

3
आप अधिकतम के बजाय लेन (i) का उपयोग करना चाहते हैं।
स्टीव मेने

25

j.append(l)इसके बजाय करें j[k] = lऔर kबिल्कुल बचें ।


2
एक छोटा (अधिक पायथन) रास्ता हो सकता हैj+=[l]
ओलेह प्रिपिन 18

2
@BlaXpirit: यह कचरा कलेक्टर को बोझ डालेगा, मुझे लगता है।
18

2
@ बालएक्सपीरिट: यह देखते हुए कि केवल कुछ पात्रों को बचाता है (विशेषकर जब से आपको स्वीकार्य होने के लिए रिक्त स्थान जोड़ने की आवश्यकता होती है) और वह .appendकहीं अधिक सामान्य है (शायद एक कारण के लिए - मुझे लगता है कि इसे समझना थोड़ा आसान है), वास्तव में बेहतर नहीं किसी भी प्रकार। (एडिट @khachik: नहीं, +=इन-प्लेस संशोधित करता है)

15

तुम भी एक सूची समझ का उपयोग कर सकते हैं:

j = [l for l in i]

या कथन का उपयोग करके इसकी एक प्रति बनाएं:

j = i[:]

वह दूसरा निर्माण साफ
जवदबा

2
यदि सूची को कॉपी करना ही एकमात्र लक्ष्य है, तो आप बस j = सूची (i) कह सकते हैं, मुझे लगता है कि प्रश्न सूची के व्यवहार के बारे में अधिक है, बजाय विशेष रूप से तत्वों को कॉपी करने के लिए।
स्टीव मेने

10
j.append(l)

लोअर-केस "L" का उपयोग करने से भी बचें क्योंकि उनके लिए 1 के साथ भ्रमित होना आसान है


7

मुझे लगता है कि पायथन विधि सम्मिलित है जिसे आप ढूंढ रहे हैं:

तत्व x को स्थिति i पर सम्मिलित करता है। list.insert (i, एक्स)

array = [1,2,3,4,5]

array.insert(1,20)

print(array)

# prints [1,2,20,3,4,5]

1
इस प्रयोजन के लिए विशेष रूप से प्रदान किए जाने पर कोई उपयोग नहीं insertहोता है append
होल्डनवेब

सूचना के बिंदु पर, आपका कोड वास्तव में प्रिंट करता है [1, 20, 2, 3, 4, 5]
होल्डनवेब

आपने सूचकांक 1 पर डाला, सूचकांकों को 1 और उसके बाद विस्थापित किया। सम्मिलित मूल्य सूचकांक 2 पर समाप्त नहीं होता है। Iist.insert () केवल वास्तव में आवश्यक है जब आप सूची के अंत में आइटम जोड़ना नहीं चाहते हैं; यहाँ सवाल ठीक ऐसा करता है ताकि list.append () बेहतर हो।
मार्टिन पीटर्स

वास्तव में मैं इस सवाल का जवाब क्यों देता हूं कि मैं भी हैरान हूं: डी पता नहीं मैंने क्या सोचा :) यह बिल्कुल "list.append ()" है जो स्वीकृत उत्तर है। मुझे लगता है कि यह लोगों की मदद करता है या उनकी समस्याओं को हल करने के लिए एक विचार देता है ताकि इसे 5 हिट मिले।
पानी

5

आप j के लिए एक शब्दकोश (एक साहचर्य सरणी के समान) का उपयोग कर सकते हैं

i = [1, 2, 3, 5, 8, 13]
j = {} #initiate as dictionary
k = 0

for l in i:
    j[k] = l
    k += 1

print j

प्रिंट होगा:

{0: 1, 1: 2, 2: 3, 3: 5, 4: 8, 5: 13}

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

2

एक और तरीका:

j=i[0]
for k in range(1,len(i)):
    j = numpy.vstack([j,i[k]])

इस मामले में jएक संख्यात्मक सरणी होगी


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