৭) List
আমরা এর আগে ভ্যারিয়েবল ইউজ করে নির্দিষ্ট মান সংরক্ষণ করেছি এবং প্রয়োজন অনুযায়ী তা ব্যবহারও করেছি। কিন্তু কখনো কখনো আমাদের অনেকগুলা মান বা মানের সংগ্রহ নিয়ে কাজ করতে হয়। তখন আমাদের লিস্টের প্রয়োজন পরে। ম্যাথম্যাটিকার লিস্ট তাহলে কী? এটাকে অনেকটা গণিতের সেটের মতো চিন্তা করতে পারেন। সেটের উপাদানগুলো যেমন কমা দিয়ে দিয়ে আলাদা করে একজোড়া second bracket এর মধ্যে রাখতে হয়, তেমনি ম্যাথমেটিকার লিস্টও একইভাবে কাজ করে। যেমন: { 1, 2, 3} এইটা একটা লিস্ট। এখানে ১ ২ ৩ কমা দিয়ে পর পর লেখা হয়েছে, এবং সেটাকে একজোড়া সেকেন্ড ব্রাকেট বা কার্লি ব্রেইসের মধ্যে রাখা হয়েছে। এখন যদি আমরা রান করি তাহলে যা টাইপ করেছিলাম সেটাই দেখতে পারবো।

আমরা চাইলে লিস্টের মধ্যে ভ্যারিয়েবলও রাখতে পারতাম। যেমন: x = 10; y = 24; z = 36; (সেমিকোলন কেন দিয়েছি কিছু মনে পড়ে?) এখন আমরা যদি {x,y,z} লিখে রান করি, তাহলে লিস্টের মধ্যে এর মান গুলা দেখতে পারবো।

আমরা যেরকম একটা সংখ্যা বা ক্যারেক্টার কে ভ্যারিয়েবল এর মধ্যে সেভ করে রাখতে পারি তেমনি একটা লিস্টকেও ভ্যারিয়েবলে একইভাবে সেভ করে রাখতে পারি।
ধরলাম list1 নামের একটি ভ্যারিয়েবল। এখন এর মধ্যে আমরা একটা লিস্ট রাখবো।
list1 = { 2, 5, 11, 30, 70} ব্যাস হয়ে গেল। এখন থেকে আমরা যখনই list1 লিখবো তখনই আমরা list1 এর ভেতরের সংখ্যাগুলো দেখতে পারবো।

এখানে গুরুত্বপূর্ণ একটি বিষয় হচ্ছে, ম্যাথম্যাটিকার default font এ ছোট হাতের L এবং 1 এই দুইটা কে দেখতে প্রায় একই রকম মনে হয়। তাই একটু অসতর্ক হলে আমরা অনেক সময় l কে 1 বা 1 কে l ভেবে বসে থাকতে পারি। তখন হাজার খুঁজেও কোডে ভুল কোথায় হয়েছে সেটা বের নাও করা যেতে পারে, যা কিনা খুবই frustrating! তাই এই ব্যাপারে আমাদেরকে যথেষ্ট সাবধানতা অবলম্বন করতে হবে।
আচ্ছা, suppose আমাদের কাছে একটা লিস্ট আছে
list2 = {3, 9, 7, 13, 11, 26, 20, 30, 100, 70}
এখন আমরা এর মধ্যের উপাদান গুলো এক্সেস করতে চাচ্ছি, তাহলে কীভাবে করবো?
তার আগে আমাদের বুঝতে হবে লিস্টের উপাদান গুলা কীভাবে ইনডেক্সিং করা হয়। ম্যাথমেটিকায় লিস্টের উপাদান গুলাকে বাম দিক থেকে গণনা করা হয়, বামদিক থেকে প্রথম উপাদানকে ধরা হয় পুরা লিস্টের 1st এলিমেন্ট। এরপরেরটাকে সেকেন্ড, তারপরেরটাকে থার্ড এভাবে চলতে থাকে। তো আমরা যদি list2 এর ৬ষ্ঠ উপাদানটা পেতে চাই, তাহলে কী করবো?
আমরা প্রথমে list2 লেখবো, এরপর দুইটা [[ ওপেনিং-স্কয়ার ব্রাকেট দিব। তারপর কত নাম্বার উপাদান চাচ্ছি সেটা লিখতে হবে (এক্ষেত্রে 6) এবং তারপর দুইটা ক্লোজিং স্কয়ার ব্রাকেট ]] দিব। এবার যদি আমরা রান করি তাহলেই আমরা 26 দেখতে পারবো, যা কিনা ঐ লিস্টটার ৬ষ্ঠ উপাদান।

একই ভাবে ১ম, ২য়, ৩য় উপাদান দেখতে চাই তাহলে list2[1] list2[2] list2[3] লিখে এন্টার দিব।

কিন্তু আউটপুট যা আসার কথা ছিল তা তো দেখছি না! কেন এমনটা হলো? এর কারণ আমরা আগেই বলে নিয়েছি যে লিস্টের উপাদান access করার জন্য আমাদেরকে দুইটা স্কয়ার ব্রাকেট ইউজ করতে হবে, এখানে আমরা একটা ব্রাকেট ইউজ করায় এই সমস্যাটা হয়েছে।

আমরা চাইলে একটা লিস্টের নির্দিষ্ট কোনো পজিশনে থাকা উপাদান চেঞ্জ করে অন্য উপাদান দিতে পারি। যেমন, যদি list2 এর মধ্যে থাকা5th element (যা কিনা 11) কে চেঞ্জ করে আমরা 77 বানাতে চাই, তাহলে আমরা প্রথমে লিস্টটার নাম লিখবো list2 এরপর দুইটা স্কয়ার ব্রাকেট এর মধ্যে 5 লিখবো (কারণ 5th element কে replace করতে চাইতেছি) তারপর একটি = চিহ্ন দিব তারপর 77 লিখবো, ব্যাস হয়ে গেল। এখন আমরা যদি list2 লিখে এক্সিকিউট করি, তাহলে দেখতে পারবো যে ১১ এর পরিবর্তে ৭৭ দেখাচ্ছে।

তো এই হচ্ছে ম্যাথম্যাটিকার লিস্টের একদম বেসিক কিছু জিনিস পাতি। লিস্ট নিয়ে কাজ করার জন্য ম্যাথমেটিকায় বেশ কিছু বিল্ট-ইন ফাংশন রয়েছে, আমরা এখন সেগুলো দেখবো।
Length[]
আমরা যদি একটা লিস্টের ভেতর মোট কতটি উপাদান আছে তা জানতে চাই তাহলে আমরা Length[] ফাংশন টা ইউজ করবো। এর জন্য, যে লিস্টের উপাদান সংখ্যা জানতে চাচ্ছি সেটাকে Length এর স্কয়ার ব্রাকেট এর মধ্যে দিয়ে run করলেই আমাদের কাজ হয়ে যাবে। যেমন:

MemberQ[]
একটা সংখ্যা আমাদের লিস্টে আছে কিনা এটি জানার জন্য বিল্ট-ইন ফাংশন আছে যার নাম MemberQ[] ।
এর মধ্যে প্রথমে লিস্টের নাম লিখতে হয় এবং এর পর কমা দিয়ে যে উপাদান টা আছে কিনা দেখতে চাই সেটা লিখতে হবে। আউটপুট যদি True আসে, তাহলে বুঝতে হবে উপাদান টা লিস্টের মধ্যে আছে আর যদি false আসে তাহলে নাই।

list2 এ 77 আছে কিনা। True দেখাচ্ছে অর্থাৎ আছে।Union[] and Join[]
আমরা চাইলে দুটা লিস্ট একটা লিস্টের মধ্যে নিয়ে আসতে পারি। এটা করা যায় দুই ভাবে। Union ও Join এই দুইটা ফাংশন এ শুধু লিস্ট দুইটার নাম দিয়ে দিলেই সেগুলার উপাদান একটা লিস্টে নিয়ে যায়।

Join আর Union এই দুইটার মূল কাজ এক হলেও এদের মধ্যে কিছু পার্থক্য আছে। Join ইউজ করলে, প্রথম লিস্টার শেষে ২য় লিস্ট টা শুধু জুড়ে দেওয়া হয়, আর কোনো কাজ করা হয় না।
অপরদিকে, দুইটা লিস্ট Union করলে, লিস্ট দুইটার উপাদানগুলোকে মানের ছোট থেকে বড় ক্রম অনুযায়ী সাজানো হয় এবং ডুপ্লিকেট উপাদান গুলার বাড়তি কপি রাখে না, অর্থাৎ একটি উপাদান কেবল একবারই থাকবে। কিন্তু Join এ মান গুলা ঊর্ধক্রম অনুসারে সাজানো হয়নি এবং দেখা যাচ্ছে ৩০, ৭০ দুই বার করে আছে।
এখানে উল্লেখ্য বিষয় হলো, Join বা Union কোনোটিই মূল list কে মডিফাই করে না, বরং নতুন একটা লিস্ট বানায়। যেমন, উপরে আমরা দেখতে পারতেছি Join এবং Union করার পরও list1 & list2 এর মান ঠিকই আছে।
আমরা list3 তে Union[list1, list2] রেখে দেই, এরপরে আমরা এটা দিয়ে অন্য উদাহরণ গুলা দেখবো।

Append[] এবং AppendTo[]
আমরা চাইলে একটা লিস্টের শেষে একটি একটি করে উপাদানও যুক্ত করতে পারি।
যেমন, list3 এর শেষে যদি 110 যুক্ত করতে চাই তাহলে Append[] ফাংশন ইউজ করবো।
এর জন্য প্রথমে Append এর স্কয়ার ব্রাকেট এর মধ্যে [] list3 এর নাম লিখবো এর পর কমা দিয়ে কী যুক্ত করতে চাই সেটা লিখবো। তাহলে আমরা list3 এর শেষে 110 যুক্ত একটা লিস্ট পাচ্ছি।

এখন list3 এর মান গুলার দিকে যদি একটু লক্ষ করি তাহলে দেখতে পারবো শেষে 110 নাই। কিন্তু আমরা তো একটু আগেই দেখলাম 110 যুক্ত হইছে। তাহলে কই গেল সেই 110?
আসলে, Append ফাংশন টা list3 এর একটা কপি তৈরি করেছে, এবং সেই কপিটার শেষে 110 যুক্ত করে সেটা output এ দেখাইছে, অরিজিলান list3 তে list3 যুক্ত করেনি। অর্থাৎ, Append[] দিয়ে কোনো লিস্ট এর শেষে পার্মানেন্টলি কিছু যুক্ত করা যায় না।
লিস্টথ্রি এর শেষে যদি ১১০ যুক্ত করে সেভ করতে চাই তাহলে?
list3 = Append[list3, 110] এভাবে আমরা কাজ টা করতে পারি।
কিন্তু লিস্ট এর শেষে পার্মানেন্টলি কিছু যুক্ত করার একটা ফাংশন আছে, আমরা সাধারণত সেটাই ইউজ করে থাকি। এর নাম AppendTo আমরা যদি AppendTo[list3, 120] লিখি তাহলে দেখতে পারবো list3 লিস্ট থ্রি এর শেষে পার্মানেন্টলি 120 যুক্ত হয়ে গেছে।

Prepend[] এবং PrependTo[]
আর আমরা যদি লিস্টের শুরুতে কোনো কিছু যুক্ত করতে চাই? তাহলে আমাদেরকে Prepend এবং PrependTo ইউজ করতে হবে। Prepend temporarily এবং PrependTo permanently উপাদান যুক্ত করে এবং Append & AppendTo এর মতোই এর সিনট্যাক্স।

Insert[]
এখন আমরা যদি লিস্টের শেষে বা শুরুতে এলিমেন্ট এ্যাড না করে মাঝের নির্দিষ্ট কোনো পজিশনে এলিমেন্ট এড করতে চাই তাহলে? একটা কমান্ড আছে Insert[]। এখানে যেই লিস্টের মধ্যে আমরা ভ্যালু insert করতে চাচ্ছি সেটা লিখতে হবে, তারপর কোন ভ্যালু টা ইনসার্ট করবো সেটা লিখতে হবে, সবশেষে কত নাম্বার পজিশন এ ভ্যালু টা ইনসার্ট করতে হবে সেটা বলে দিতে হবে।

একটি লিস্টের প্রথম থেকে ৩য় পজিশনে ভ্যালু ইনসার্ট না করে আমরা যদি শেষ থেকে ৩য় পজিশনে ইনসার্ট করতে চাই? তাহলে আমরা 3 এর বদলে শুধু মাইনাস থ্রি দিব।

insert[] ও Append[] Prepend[] এর মতো পার্মানেন্টলি ভ্যালু ইনসার্ট করে না, শুধু সাময়িক একটা কপি তৈরি করে রাখে।
এ তো গেল ভ্যালু ইনসার্ট করার ব্যাপার আমরা যদি ভ্যালু ডিলেট করতে চাই তাহলে ?
Delete[]
List থেকে উপাদান ডিলেট করার জন্য একটি ফাংশন আছে, নাম হচ্ছে Delete[]। এটার syntax Insert এর মতোই।

ডিলেটও পার্মানেন্টলি এলিমেন্ট রিমুভ করে না।
Take[] এবং Drop[]
লিস্ট নিয়ে বেসিক কাজ করার জন্য আরো দুইটা ফাংশন আছে। একটা হলো Take আরেকটা হলো Drop।
কখনো কখনো আমাদের একটা লিস্ট এর সব গুলা উপাদান না-ও লাগতে পারে। হয়তো কিছু নির্দিষ্ট উপাদান লাগতে পারে, অথবা কিছু নির্দিষ্ট উপাদান বাদে বাকি সকল উপাদান কাজে লাগতে পারে। এই কাজ গুলো মূলত Take আর Drop দিয়ে করে।
Take[] Drop[]ও স্থায়ী ভাবে লিস্ট কে মডিফাই করে না, বরং একটা অস্থায়ী কপি জেনারেট করে।

এভাবে শুধু প্রথম বা শেষ থেকে এলিমেন্ট না নিয়ে আমরা চাইলে মাঝখান থেকেও এলিমেন্ট নিতে পারি। এক্ষেত্রে আমাদেরকে একটা রেঞ্জ বলে দিতে হবে, যেখানে, আমরা কত নাম্বার এলিমেন্ট থেকে কত নাম্বার এলিমেন্ট চাচ্ছি সেই পজিশন টা থাকবে। যেমন আমরা যদি list3 এর ৫ম উপাদান থেকে ১০ম উপাদান পর্যন্ত চাই তাহলে আমরা এভাবে লিখবো:

Drop[] ফাংশন টা Take[] এর মতোই ইউজ করতে হয়। তবে এর কাজ টা ঠিক উল্টো। আমরা দেখেছি Take[] প্রথম বা শেষ N সংখ্যক এলিমেন্ট নেয়, বা মাঝখান থেকে একটা রেঞ্জ অনুযায়ী এলিমেন্ট নেয়। কিন্তু Drop[] প্রথম বা শেষ থেকে N সংখ্যক এলিমেন্ট ড্রপ করে অর্থাৎ বাদ দিয়ে লিস্ট এর বাকি উপাদানগুলো নেয়।

FromDigits[] এবং IntegerDigits[]
আমরা চাইলে একটা লিস্টের সকল উপাদান দিয়ে একটা সংখ্যা বানাতে পারি।
এর জন্য FromDigits[] ফাংশনের ভেতরে সেই লিস্ট টা বসায়ে দিলেই কাজ হয়ে যাবে।

এর বিপরীত কাজ টাও করা সম্ভব। অর্থাৎ, একটা সংখ্যা দেওয়া থাকলে সেটার ডিজিট গুলোকে আলাদা করে একটা লিস্টে নিতে পারি। এর জন্য যে ফাংশন টা ব্যবহার হয় তার নাম IntegerDigits[], এর মধ্যে আমরা আমাদের সংখ্যাটা দিয়ে যদি রান করি তাহলেই এমন একটা লিস্ট পাব যার উপাদানগুলো হলো ঐ সংখ্যাটার ডিজিট।

Reverse[]
নাম শুনেই বোঝা যাচ্ছে এটি একটি লিস্টকে উল্টায়ে দিবে। (তবে স্থায়ী ভাবে না।)

এই ছিল লিস্টের মোটামুটি বেসিক ধারণা। ম্যাথমেটিকায় লিস্ট একটি গুরুত্বপূর্ণ কনসেপ্ট। তাই আশা করবো ডকুমেন্টেশন সেন্টার থেকে আমরা নিজ উদ্যোগে লিস্ট নিয়ে আরও explore করবো, যেহেতু এখানে সব দেখানো সম্ভব না।
Last updated