Skip to content

Latest commit

 

History

History
237 lines (176 loc) · 17.5 KB

lists.md

File metadata and controls

237 lines (176 loc) · 17.5 KB

লিস্টস ইন ডেপথ

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

কিভাবে লিস্ট ডিক্লেয়ার করব? (থার্ড) ব্রাকেটের ভিতরে কমা দিয়ে একেকটি আইটেম সেপারেট করে দিলেই লিস্ট তৈরি হয়ে যাবে । আসুন উদাহরণ দেখি:

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() ফাংশনটির ব্যবহার দেখে নেই । এই ফাংশনটির একটি উদাহরণ দেখি :

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() ফাংশনটি ব্যবহার করে দ্রুত লিস্ট তৈরি করে নিব । আসুন ফেরা যাক লিস্টে । আমরা দেখেছি কিভাবে ইন্ডেক্স ব্যবহার করে আমরা লিস্টের আইটেমগুলো এক্সেস করেছি । ধরূন আমাদের লিস্টের সব ডাটা লাগবে না, আমরা একটি নির্দিষ্ট রেঞ্জ নিয়ে কাজ করতে চাই । পাইথন আমাদের সেই সুবিধা দেয় (যা অন্য অনেক ল্যাঙ্গুয়েজে পাওয়া যায় না ) । আসুন দেখি কিভাবে:

এই উদাহরণটি নিজেরা চেষ্টা করার জন্য প্রথমেই একটি লিস্ট তৈরি করে নেই ।

sl = range(1,11) # A list containing the integers from 1 to 10

আসুন এবার লিস্ট নিয়ে নাড়া চাড়া করা যাক:

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 ব্যবহার করা যায় । যেমন:

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() ফাংশনের কথা উল্লেখ করেছিলাম । পাইথনে কোন নাম সম্পর্কে টেকনিক্যাল বিষয় (প্রোপার্টিজ, মেথডস ইত্যাদি) জানার জন্য আমরা এই ফাংশনটি ব্যবহার করি । আসুন ঝটপট একটি লিস্টের উপর এই ফাংশনটি প্রয়োগ করি :

>>> 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() ব্যবহার করি । যেমন:

>>> l = [1,2]
>>> l.append(3)
>>> print l
[1, 2, 3]
>>>

এখানে l একটি লিস্ট যেটার শেষে আমরা 3 যোগ করলাম । কোন লিস্টে একটি আইটেম কতবার আছে তা জানার জন্য আমরা count() ব্যবহার করি । যেমন:

>>> 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() ফাংশনটি ব্যবহার করি । যেমন:

lst = [1,1,1,2,2,2,2,4,4,4,4]
print len(lst)

এই কোড রান করে দেখুন আউটপুট কি দেখায় । একটি লিস্টের শেষে আরেকটি লিস্ট যোগ করতে আমরা extend() ব্যবহার করি । যেমন:

>>> lst1 = [1,2]
>>> lst2 = [2,3]
>>> lst1.extend(lst2)
>>> lst1
[1, 2, 2, 3]
>>>

এখানে lst1 লিস্টটির শেষে lst2 যোগ করলাম । এর ফলে lst1 এর আইটেমগুলোর সাথে lst2 এর আইটেমগুলোও যুক্ত হয়ে গেল ।

এবার আসা যাক index() এ । কোন লিস্টে কোন আইটেম এর অবস্থান বা ইন্ডেক্স জানতে আমরা এটি ব্যবহার করি । লিস্টে যদি ঐ আইটেম একাধিকবার থাকে তাহলে প্রথম অবস্থানটি পাওয়া যাবে। যেমন:

>>> lst1 = [1,2,2,3]
>>> lst1.index(2)
1
>>>

এখানে 2 আইটেমটি দুবার এসেছে – 1 এবং 2 ইন্ডেক্সে । তাই প্রথম অবস্থানটি পেলাম আমরা ।

insert() – এটি ব্যবহার করে আমরা একটি লিস্টের যে কোন অবস্থানে আরেকটি আইটেম যোগ করতে পারি । যেমন:

>>> l = [1,2,3]
>>> l.insert(2,4)
>>> l
[1, 2, 4, 3]
>>>

দেখুন insert() মেথডটি দুটি প্যারামিটার গ্রহন করে । প্রথম প্যারামিটারটি দ্বারা আমরা নির্দেশ করি কোন অবস্থানে আইটেমটি বসাতে হবে, দ্বিতীয় প্যারামিটার হিসেবে আমরা সরাসরি আইটেমটিকে পাস করি । অর্থাৎ, l.insert(2,4) এর অর্থ হল l লিস্টের 2-তম অবস্থানে 4 আইটেমটিকে যোগ করা ।

এবার আসা যাক pop() মেথডে । এই মেথডটি লিস্টের সর্বশেষ আইটেমটি রিটার্ন করে এবং ঐ লিস্ট থেকে এটিকে বাদ দিয়ে দেয় । যেমন:

>>> 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() মেথডের ঠিক উলটো কাজ করে থাকে । এটিকে কোন অবস্থান দেখিয়ে দিলে সেই অবস্থানের আইটেমটিকে রিমুভ করাই এর কাজ । আসুন একটি উদাহরণ দেখে নেই:

>>> l = [2,5,4]
>>> l.remove(2)
>>> l
[5, 4]
>>>

আমরা দেখলাম কিভাবে remove() মেথডের সাহায্যে যে কোন একটি আইটেম আমরা রিমুভ করতে পারি । এই মেথডটি ছারাও আমরা পাইথনের বিল্ট ইন ফাংশন del() ব্যবহার করেও কোন আইটেম রিমুভ করতে পারি । যেমন:

l = [2,5,4,4]
del(l[3])
print l

এরপরে চলুন দেখে নেই sort() এবং reverse() মেথডের ব্যবহার । sort() ব্যবহার করে যে কোন লিস্টকে সর্ট বা স্বাভাবিকভাবে সাজানো হয়:

>>> s = [2,5,1,6,2,9,3]
>>> s.sort()
>>> s
[1, 2, 2, 3, 5, 6, 9]
>>>

reverse() মেথডটি লিস্ট কে উলটো ভাবে সাজানোর জন্যে ব্যবহার করা হয়:

>>> l = ['a', 'b', 'c']
>>> l.reverse()
>>> l
['c', 'b', 'a']
>>>