এই পুনরাবৃত্ত তালিকাটি ক্রমবর্ধমান কোড কেন সূচিপত্র দেয়: তালিকা নিয়োগের সূচকটি সীমার বাইরে?


194

নিম্নলিখিত কোড বিবেচনা করুন:

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

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

print j

আউটপুট (উইন 7 32-বিটের পাইথন ২. 2...6) হ'ল:

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

আমি অনুমান করি এটি সহজ কিছু যা আমি বুঝতে পারি না। কেউ কি এটি পরিষ্কার করতে পারেন?


6
appendআপনার ব্যবহারের ক্ষেত্রে সঠিক সমাধান, তবে পাইথন তালিকায় একটি সন্নিবেশ পদ্ধতি রয়েছে যা তালিকার প্রথম অবস্থানে সরাসরি প্রবেশ করতে পারে। j.insert(k, l)
opensourcegeek

আমি জিজ্ঞাসা করতে পারি, ওপির সমাধান কেন কাজ করবে না? অ্যাপেন্ড কেন ব্যবহার করবেন?
হেলেন

উত্তর:


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
ঠিক আছে, অনেক ধন্যবাদ তোমাকে. তিনটি প্রায় একই উত্তর রয়েছে বলে আমি কোনটির প্রশংসা করব তা জানতাম না। এটি আমার মনে হয় সবচেয়ে বর্ণনামূলক। চিয়ার্স
ভ্লাদান

আমি দেখতে পাচ্ছি যে পিএইচপি বা সি এর মতো অন্যান্য ভাষা থেকে আগত ব্যক্তিদের জন্য এটি খুব বিভ্রান্তিকর হতে পারে জে তালিকা এক ধরণের তালিকা, অ্যারে নয়। তালিকার ধরণ সহ, আমি মনে করি না এটি সাবস্ক্রিপ্টযোগ্য। অন্য ভাষা থেকে আসা খুব বিভ্রান্তিকর।
Nguai আল

@ এনগুইয়াল তালিকার ধরণটি সাবস্ক্রিপ্টযোগ্য, তবে আপনি কেবল ইতিমধ্যে বিদ্যমান উপাদানগুলিতে অ্যাক্সেস করতে পারবেন - সীমার বাইরে থাকা কোনও সূচীতে লেখার চেষ্টা করে আপনি কোনও উপাদান তৈরি করতে পারবেন না। j [0] = "ফু" কাজ করবে যদি তালিকায় ইতিমধ্যে কমপক্ষে একটি উপাদান থাকে।
স্টিভ মেনে

52

আপনার অন্য বিকল্পটি শুরু করার জন্য j:

j = [None] * len(i)

3
আপনি সর্বাধিকের চেয়ে লেন (i) ব্যবহার করতে চান।
স্টিভ

25

কি j.append(l)পরিবর্তে j[k] = lএড়িয়ে চলুন kএ সব।


2
একটি সংক্ষিপ্ত (আরও পাইথোনিক?) উপায় হতে পারেj+=[l]
ওলেহ প্রিপিন

2
@ ব্ল্যাকস্পিরিত: আমার মনে হয় এটি আবর্জনা সংগ্রহকারীকে বোঝা চাপিয়ে দেবে।
খচিক

2
@ বালএক্সপিরিট: প্রদত্ত যা কেবলমাত্র কয়েকটি অক্ষর সংরক্ষণ করে (বিশেষত যেহেতু এটি গ্রহণযোগ্য হওয়ার জন্য আপনার স্পেস যুক্ত করতে হবে) এবং এটি .appendআরও সাধারণ (সম্ভবত একটি কারণ হিসাবে - আমি মনে করি এটি বুঝতে কিছুটা সহজ) সত্যই উন্নত নয় যেকোন ভাবে. (@ খাচিক সম্পাদনা করুন: না, +=জায়গায় জায়গায় পরিবর্তন করুন)

15

আপনি একটি তালিকা বোধগম্যতা ব্যবহার করতে পারেন:

j = [l for l in i]

অথবা বিবৃতিটি ব্যবহার করে এর একটি অনুলিপি তৈরি করুন:

j = i[:]

দ্বিতীয়
নির্মাণটি

2
তালিকার অনুলিপি করা যদি একমাত্র লক্ষ্য হয় তবে আপনি কেবল j = list বলতে পারবেন (i) আমি মনে করি প্রশ্নগুলি তালিকার আচরণ সম্পর্কে আরও বেশি, বিশেষত উপাদানগুলির অনুলিপি করার কোনও উপায়ের প্রয়োজন না থেকে।
স্টিভ

10
j.append(l)

লোয়ার-কেস "এল এর" ব্যবহার এড়িয়ে চলুন কারণ তাদের পক্ষে 1 এর সাথে বিভ্রান্ত হওয়া সহজ


7

আমি মনে করি পাইথন পদ্ধতি সন্নিবেশ হ'ল আপনি যা খুঁজছেন:

পজিশনে উপাদানটি x প্রবেশ করান i। list.insert (ঝ, x) এর

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 এবং এরপরে স্থানান্তরিত করে। Sertedোকানো মান সূচক 2 এ শেষ হয় না Iist.insert () কেবলমাত্র তখনই প্রয়োজন হয় যখন আপনি তালিকার শেষে আইটেমটি যুক্ত করতে চান না; এখানে প্রশ্নটি ঠিক তাই করে list list.append () ভাল।
মার্টিজান পিটারস

আসলে আমি কেন এই প্রশ্নের উত্তর দিচ্ছি যে আমিও অবাক হয়েছি: ডি আমি কী ভেবেছিলাম তা জানেন না :) এটি হ'ল "list.append ()" যা গ্রহণযোগ্য উত্তর। আমি মনে করি এটি লোককে সহায়তা করে বা তাদের সমস্যাগুলি সমাধান করার জন্য একটি ধারণা দেয় যাতে এটি 5 টি হিট হয়।
জল

5

আপনি জে এর জন্য একটি অভিধান (একটি মিশুক অ্যারের অনুরূপ) ব্যবহার করতে পারেন

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একটি numpy অ্যারে হবে


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.