# লিস্টস ইন ডেপথ লিস্ট শব্দের বাংলা অর্থ তালিকা। আমাদের বোধহয় ব্যখ্যা করার দরকার পড়ে না তালিকা কি জিনিস । পাইথনেও লিস্ট একই কাজ করে । সহজ কথায় লিস্ট হল কতগুলো আইটেমের একটি তালিকা । অনেক প্রোগ্রামিং ল্যাঙ্গুয়েজে লিস্ট ডিক্লেয়ার করার সময় বলে দিতে হয় লিস্টের আইটেমগুলোর টাইপ কি হবে, পাইথনে তার দরকার পড়ে না । একটি লিস্টের আইটেমগুলো বিভিন্ন টাইপের হতে পারে । কিভাবে লিস্ট ডিক্লেয়ার করব? (থার্ড) ব্রাকেটের ভিতরে কমা দিয়ে একেকটি আইটেম সেপারেট করে দিলেই লিস্ট তৈরি হয়ে যাবে । আসুন উদাহরণ দেখি: ```python my_list = [1,"a string",45.56] print my_list[0] print my_list[1] print my_list[2] print my_list print type(my_list[0]) print type(my_list[1]) print type(my_list[2]) ``` প্রথমে কোডগুলো মনোযোগ দিয়ে পড়ুন । বোঝার চেষ্টা করূন এর আউটপুট কি হতে পারে । বরাবরের মত একটি পাইথন ফাইলে এই কোডগুলো লিখে রান করে দেখুন কি আউটপুট দেখায় । `type()` ফাংশনটির ব্যবহার আমরা আগেই দেখেছি । আউটপুট দেখে মিলিয়ে নিন আপনি কি আশা করেছিলেন আউটপুট হিসেবে আর কি এসেছে আউটপুট । যদি না মিলে, বোঝার চেষ্টা করূন কোথায় বুঝতে পারেন নি । এই কোড থেকে আমরা কি কি দেখলাম: * কিভাবে লিস্ট ডিক্লেয়ার করতে হয় * লিস্টের আইটেমগুলোর একটি ইন্ডেক্স ভ্যালু থাকে। * এই ইন্ডেক্স ভ্যালু ব্যবহার করে আমরা n-তম আইটেমের মান বের করতে পারি । * এই ভ্যালুর মান 0 থেকে শুরু হয় । অর্থাৎ প্রথম আইটেমের ইন্ডেক্স 0, দ্বিতীয়টির 1 এভাবে n-তম আইটেমের ইন্ডেক্স (n-1) । লিস্ট সম্পর্কে আরো জানার আগে আমরা `range()` ফাংশনটির ব্যবহার দেখে নেই । এই ফাংশনটির একটি উদাহরণ দেখি : ```python print range(0,10) print range(0, 100, 10) ``` এই ফাংশনটি সংখ্যার লিস্ট তৈরি করে । এর সিগনেচার অনেকটা এরকম: `range(min,max,step)` । এখানে `min` হল নূন্যতম ভ্যালু যেটা থেকে লিস্ট শুরু হবে । `max` হল সর্বোচ্চ ভ্যালু যেটার ঠিক আগের ভ্যালু পর্যন্ত লিস্ট তৈরি হবে । `step` হল মধ্যবর্তী ব্যবধান । উপরোক্ত কোড রান করালে প্রথমে আমরা পাব 0 থেকে শুরু করে 10 এর ঠিক আগের ভ্যালু অর্থাৎ 9 পর্যন্ত । যদি step না দেওয়া হয় তাহলে পাইথন এটার ভ্যালু 1 ধরে নেয় । দ্বিতীয় বার আমরা step হিসেবে 10 দিয়েছি । তাই এবার আমরা 0 থেকে শুরু করে প্রতি 10 ঘর পর পর সংখ্যার লিস্ট পাব 90 পর্যন্ত । আমরা লিস্ট প্র্যাকটিস করার জন্য range() ফাংশনটি ব্যবহার করে দ্রুত লিস্ট তৈরি করে নিব । আসুন ফেরা যাক লিস্টে । আমরা দেখেছি কিভাবে ইন্ডেক্স ব্যবহার করে আমরা লিস্টের আইটেমগুলো এক্সেস করেছি । ধরূন আমাদের লিস্টের সব ডাটা লাগবে না, আমরা একটি নির্দিষ্ট রেঞ্জ নিয়ে কাজ করতে চাই । পাইথন আমাদের সেই সুবিধা দেয় (যা অন্য অনেক ল্যাঙ্গুয়েজে পাওয়া যায় না ) । আসুন দেখি কিভাবে: এই উদাহরণটি নিজেরা চেষ্টা করার জন্য প্রথমেই একটি লিস্ট তৈরি করে নেই । ```python sl = range(1,11) # A list containing the integers from 1 to 10 ``` আসুন এবার লিস্ট নিয়ে নাড়া চাড়া করা যাক: ```python list1to5 = sl[0:5] print list1to5 list2to7 = sl[1:7] print list2to7 ``` এই কোড রান করালে দেখা যাবে `list1to5` একটি লিস্ট যার ভ্যালু 1 থেকে 5 । `sl[0:5]` বলতে বোঝানো হয় `sl` নামক লিস্টের 0-তম আইটেম থেকে শুরু করে 5-তম আইটেমের আগের আইটেম পর্যন্ত আইটেমগুলো নিয়ে তৈরি একটি লিস্ট । এবার নিজে নিজেই বোঝার চেষ্টা করুন `list2to7` এর ভ্যালু কি হতে পারে এবং কেন । এবার নিজে কিছু কাজ করুন: * 3 থেকে 9 পর্যন্ত লিস্ট বোঝাতে আমরা কি লিখব? * `sl[:5]` এর ভ্যালু কত হবে? * `sl[4:]` এর ভ্যালু কত হবে? * `sl[:]` এর ভ্যালু কত হবে? কেন? আমরা `range()` ফাংশনে step এর ব্যবহার দেখেছিলাম । লিস্টের ক্ষেত্রেও step ব্যবহার করা যায় । যেমন: ```python print sl[0:10:2] print sl[0:9:3] ``` অর্থাৎ শেষে আরেকটি কোলন দিয়ে আমরা step ভ্যালুটি নির্দেশ করে থাকি । তাই প্রথম ক্ষেত্রে আমরা 0-তম আইটেম থেকে শুরু করে 2টি আইটেম বাদ দিয়ে দিয়ে 10-তম আইটেমের আগের আইটেম পর্যন্ত যে আইটেগুলো আছে সেগুলোর লিস্ট পাব । নিজে নিজে বোঝার চেষ্টা করি দ্বিতীয় ক্ষেত্রে কি ঘটছে । যে কোন ভ্যালুর আগে মাইনাস চিহ্ন দিলে তার অবস্থান বিপরীত দিক থেকে বিবেচনা করা হয় । তাই শেষ দিক থেকে 5-তম আইটেমের ভ্যালু হবে `sl[-5]` । এভাবে শেষ দিক থেকে 2-তম আইটেমের আগ পর্যন্ত আইটেমগুলোর লিস্ট পাব: `sl[:-2]` । step এর ভ্যালু নেগেটিভ হলে গনণা উল্টো দিকে হবে । যেমন শেষ দিক থেকে 2-তম আইটেমের আগের আইটেম থেকে শুরু করে 3-তম আইটেম পর্যন্ত আইটেমগুলো 2 ধাপ করে পেছালে আমরা যে লিস্টটি পাব তার জন্য আমাদের কে লিখতে হবে : `sl[-2:3:-2]` এভাবে নিজেরা ইচ্ছামত লিস্ট তৈরি করে তার বিভিন্ন অংশ আলাদা করার চেষ্টা করি । প্রথমবার দেখে লিস্টের সিন্ট্যাক্স খুব জটিল মনে হতে পারে । কিন্তু কিছুদিন অনুশীলন করলেই ঠিক হয়ে যাবে । পাইথনের চমৎকার ফিচারগুলোর মধ্যে অন্যতম হল লিস্ট এর এই ব্যবহার । একটি লিস্ট এর যে কোন অংশ নিয়ে আরেকটি লিস্ট খুব সহজেই তৈরি করা যায়। আমি এর আগে `dir()` ফাংশনের কথা উল্লেখ করেছিলাম । পাইথনে কোন নাম সম্পর্কে টেকনিক্যাল বিষয় (প্রোপার্টিজ, মেথডস ইত্যাদি) জানার জন্য আমরা এই ফাংশনটি ব্যবহার করি । আসুন ঝটপট একটি লিস্টের উপর এই ফাংশনটি প্রয়োগ করি : ```python >>> list = [1,2,3] >>> dir(list) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delsli ce__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__gets lice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', ' __le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__r educe_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__ ', '__setslice__', '__str__', 'append', 'count', 'extend', 'index', 'insert', 'p op', 'remove', 'reverse', 'sort'] >>> ``` আমরা দেখতে পাচ্ছি একটি লিস্টের অনেকগুলো মেথড ও প্রোপার্টি রয়েছে । যেগুলোর আগে এবং পরে __ (ডাবল আন্ডারস্কোর) রয়েছে সেগুলো নিয়ে আমরা মাথা ঘামাব না । বাকিগুলোর মধ্যে আমরা দেখতে পাচ্ছি: * `append()` * `count()` * `extend()` * `index()` * `insert()` * `pop()` * `remove()` * `reverse()` * `sort()` কোন লিস্টের শেষে আরেকটি আইটেম যোগ করতে আমরা append() ব্যবহার করি । যেমন: ```python >>> l = [1,2] >>> l.append(3) >>> print l [1, 2, 3] >>> ``` এখানে l একটি লিস্ট যেটার শেষে আমরা 3 যোগ করলাম । কোন লিস্টে একটি আইটেম কতবার আছে তা জানার জন্য আমরা count() ব্যবহার করি । যেমন: ```python >>> l = [1,1,1,1,1,2,2,2,4,4,4,5,5,5,5,5,5,5,5,5,7,7,2,1,3] >>> l.count(1) 6 >>> l.count(7) 2 >>> l.count(3) 1 >>> l.count(5) 9 >>> l.count(4) 3 >>> l.count(2) 4 >>> ``` তাহলে দেখলাম l লিস্টটিতে বিভিন্ন আইটেম কতবার আছে তা কিভাবে বের করা যায় । লক্ষ্য করূন অন্যান্য অনেক প্রোগ্রামিং ল্যাঙ্গুয়েজে count বা length এই ধরনের ফাংশন, মেথড বা প্রোপার্টি দিয়ে লিস্টের আকার বা আইটেমের সংখ্যা নির্নয় করা হয় । পাইথনে count এর ব্যবহারটি কিছুটা ভিন্ন । আর পাইথনে একটি লিস্ট এর আইটেম সংখ্যা বের করতে আমরা `len()` ফাংশনটি ব্যবহার করি । যেমন: ```python lst = [1,1,1,2,2,2,2,4,4,4,4] print len(lst) ``` এই কোড রান করে দেখুন আউটপুট কি দেখায় । একটি লিস্টের শেষে আরেকটি লিস্ট যোগ করতে আমরা `extend()` ব্যবহার করি । যেমন: ```python >>> lst1 = [1,2] >>> lst2 = [2,3] >>> lst1.extend(lst2) >>> lst1 [1, 2, 2, 3] >>> ``` এখানে `lst1` লিস্টটির শেষে `lst2` যোগ করলাম । এর ফলে `lst1` এর আইটেমগুলোর সাথে `lst2` এর আইটেমগুলোও যুক্ত হয়ে গেল । এবার আসা যাক `index()` এ । কোন লিস্টে কোন আইটেম এর অবস্থান বা ইন্ডেক্স জানতে আমরা এটি ব্যবহার করি । লিস্টে যদি ঐ আইটেম একাধিকবার থাকে তাহলে প্রথম অবস্থানটি পাওয়া যাবে। যেমন: ```python >>> lst1 = [1,2,2,3] >>> lst1.index(2) 1 >>> ``` এখানে 2 আইটেমটি দুবার এসেছে – 1 এবং 2 ইন্ডেক্সে । তাই প্রথম অবস্থানটি পেলাম আমরা । `insert()` – এটি ব্যবহার করে আমরা একটি লিস্টের যে কোন অবস্থানে আরেকটি আইটেম যোগ করতে পারি । যেমন: ```python >>> l = [1,2,3] >>> l.insert(2,4) >>> l [1, 2, 4, 3] >>> ``` দেখুন `insert()` মেথডটি দুটি প্যারামিটার গ্রহন করে । প্রথম প্যারামিটারটি দ্বারা আমরা নির্দেশ করি কোন অবস্থানে আইটেমটি বসাতে হবে, দ্বিতীয় প্যারামিটার হিসেবে আমরা সরাসরি আইটেমটিকে পাস করি । অর্থাৎ, `l.insert(2,4)` এর অর্থ হল `l` লিস্টের 2-তম অবস্থানে 4 আইটেমটিকে যোগ করা । এবার আসা যাক `pop()` মেথডে । এই মেথডটি লিস্টের সর্বশেষ আইটেমটি রিটার্ন করে এবং ঐ লিস্ট থেকে এটিকে বাদ দিয়ে দেয় । যেমন: ```python >>> l = [2,5,4] >>> l [2, 5, 4] >>> s = l.pop() >>> s 4 >>> l [2, 5] >>> ``` দেখা যাচ্ছে এখানে `l.pop()` মেথড কলটি l লিস্টের সর্বশেষ আইটেম 4 কে রিটার্ন করছে (যেটিকে আমরা s নামে সংরক্ষণ করলাম) । এবং এই একই সাথে l লিস্টটি থেকে এই শেষ আইটেম 4 কেও বাদ দিয়ে দিয়েছে । এবার আসা যাক `remove()` মেথডে । এটি `insert()` মেথডের ঠিক উলটো কাজ করে থাকে । এটিকে কোন অবস্থান দেখিয়ে দিলে সেই অবস্থানের আইটেমটিকে রিমুভ করাই এর কাজ । আসুন একটি উদাহরণ দেখে নেই: ```python >>> l = [2,5,4] >>> l.remove(2) >>> l [5, 4] >>> ``` আমরা দেখলাম কিভাবে `remove()` মেথডের সাহায্যে যে কোন একটি আইটেম আমরা রিমুভ করতে পারি । এই মেথডটি ছারাও আমরা পাইথনের বিল্ট ইন ফাংশন `del()` ব্যবহার করেও কোন আইটেম রিমুভ করতে পারি । যেমন: ```python l = [2,5,4,4] del(l[3]) print l ``` এরপরে চলুন দেখে নেই `sort()` এবং `reverse()` মেথডের ব্যবহার । `sort()` ব্যবহার করে যে কোন লিস্টকে সর্ট বা স্বাভাবিকভাবে সাজানো হয়: ```python >>> s = [2,5,1,6,2,9,3] >>> s.sort() >>> s [1, 2, 2, 3, 5, 6, 9] >>> ``` `reverse()` মেথডটি লিস্ট কে উলটো ভাবে সাজানোর জন্যে ব্যবহার করা হয়: ```python >>> l = ['a', 'b', 'c'] >>> l.reverse() >>> l ['c', 'b', 'a'] >>> ```