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