লিস্ট

লিস্ট #

তালিকা আমরা সবাই চিনি। বিবাহিত ভাইয়েরা প্রতিদিন সকালে যে ফর্দ নিয়ে বাজার করতে যান তাহাই লিস্ট। এই লিস্টে অনেকগুলো আইটেম থাকে। সাধারণত ভাবিরা এই আইটেমগুলো ঠিক করে দেন। ১, ২, ৩ এরকম সিরিয়াল নাম্বার দিয়ে একের পর এক আইটেম লিখে ভাইদের হাতে ধরিয়ে দেন। ব্যাচেলরদের ক্ষেত্রেও লিস্টের ভূমিকা প্রবল। দৈনন্দিন জীবনে কোন না কোন কাজের জন্য লিস্ট আমাদের করাই লাগে।

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

লিস্টকে আমরা ডাটা টাইপ বললেও লিস্ট আসলে পাইথনের বিল্ট-ইন ডাটা স্ট্রাকচারের অন্তর্গত। লিস্ট একটা ডাটা টাইপ তো অবশ্যই, তবে ডাটা স্ট্রাকচার বলাই শ্রেয়। ডাটা স্ট্রাকচার হল ডাটা স্টোর ও অর্গানাইজ করার একটা স্পেশালাইজড ফরম্যাট। এই বইয়ে আমরা পাইথনের চার ধরনের ডাটা স্ট্রাকচার শিখব: লিস্ট, টাপল, সেট ও ডিকশনারি।

পাইথনে লিস্ট তৈরি করা খুবই সহজ কাজ। আইটেমগুলো কমা দিয়ে সেপারেট করে লিখলাম, এবার সেগুলোকে [] এর ভিতর পুরে দিলাম। ব্যাস, হয়ে গেল। একটা উদাহরণ দেখা যাক:

>>> a = []
>>> a
[]
>>> type(a)
<type 'list'>
>>> a = ['onion', 'potato', 'ginger', 'cucumber']
>>> a
['onion', 'potato', 'ginger', 'cucumber']
>>> type(a)
<type 'list'>

একটু বোঝা যাক বিষয়টা। a = [] দিয়ে আমরা একটা লিস্ট ডিক্লেয়ার করেছি (লিস্ট টাইপের অবজেক্ট তৈরি করেছি)। তবে এই লিস্টটা ফাঁকা, এর ভিতর কোন আইটেম নাই। a = ['onion', 'potato', 'ginger', 'cucumber'] দিয়ে আমরা একটা লিস্ট তৈরি করেছি যেখানে চারটা আইটেম রয়েছে। এখন আইটেম নিয়ে একটু কথা বলা যাক।

লিস্টের আইটেমের ডাটা টাইপ যেকোন কিছুই হতে পারে। আমরা এই লিস্টে স্ট্রিং ব্যবহার করেছি। তবে ইন্টিজার, ফ্লোট যা খুশি ব্যবহার করতে পারতাম। এমনকি চাইলে লিস্ট, টাপল বা ডিকশনারিও ব্যবহার করতে পারতাম। আসলে লিস্টের সব আইটেমগুলো যে একই ডাটা টাইপের হতে হবে এরকম কোন বিধি নিষেধ নেই, মিক্সড ডাটা টাইপের হতেই পারে।

>>> b = ['onion', 'potato', 'ginger', 'cucumber', 1, 3.1416]
>>> b
['onion', 'potato', 'ginger', 'cucumber', 1, 3.1416]
>>> type(b)
<type 'list'>

অ্যাক্সেস আইটেম #

এবার আমরা লিস্টের আইটেম বা ভ্যালুগুলো অ্যাক্সেস করব। আচ্ছা স্ট্রিং অ্যাক্সেস করা মনে আছে তো আমাদের? ঐ যে ইনডেক্স নম্বর দিয়ে অ্যাক্সেস করেছিলাম। হুম, লিস্টের ক্ষেত্রেও হুবহু একই নিয়ম প্রযোজ্য। লিস্টের ইনডেক্সও 0 থেকে শুরু হয়।

>>> b = ['onion', 'potato', 'ginger', 'cucumber', 1, 3.1416]
>>> b[0]
'onion'
>>> b[1]
'potato'
>>> b[1:5]
['potato', 'ginger', 'cucumber', 1]
>>> b[:5]
['onion', 'potato', 'ginger', 'cucumber', 1]
>>> b[2:]
['ginger', 'cucumber', 1, 3.1416]

হুবহু একই জিনিস, তাই না? যাহোক, চলুন আমরা আমাদের আইটেমগুলোর ডাটা টাইপ চেক করে দেখি।

>>> b = ['onion', 'potato', 'ginger', 'cucumber', 1, 3.1416]
>>> type(b[0])
<type 'str'>
>>> type(b[4])
<type 'int'>
>>> type(b[5])
<type 'float'>

মিক্সড ডাটা টাইপের লিস্ট।

আপডেট লিস্ট #

একটা কথা বলতে ভুলে গেছি। পাইথনে = কে অ্যাসাইনমেন্ট অপারেটর বলা হয়। কোন ভ্যারিয়েবলে কোন ভ্যালু অ্যাসাইন করার জন্য এই অপারেটর আমরা ইতিপূর্বেই ব্যবহার করেছি। এখন আমরা এটা ব্যবহার করে আমাদের লিস্টকে আপডেট করব। মানে যে ইনডেক্সে যে আইটেম আছে, সেটা পরিবর্তন করে ফেলব। ‘onion’ এর জায়গায় ‘rice’ লিখব, 1 এর জায়গায় 570 লিখব আর 3.1416 এর জায়গায় 23486.4678 লিখব। কিভাবে করব? দেখা যাক:

>>> b = ['onion', 'potato', 'ginger', 'cucumber', 1, 3.1416]
>>> b[0] = 'rice'
>>> b
['rice', 'potato', 'ginger', 'cucumber', 1, 3.1416]
>>> b[4] = 570
>>> b
['rice', 'potato', 'ginger', 'cucumber', 570, 3.1416]
>>> b[5] = 23486.4678
>>> b
['rice', 'potato', 'ginger', 'cucumber', 570, 23486.4678]

আমাদের মনে একটা প্রশ্ন জাগতে পারে যে স্ট্রিংয়ের জায়গায় স্ট্রিং, ইন্টিজারের জায়গায় ইন্টিজার আর ফ্লোটের জায়গায় ফ্লোটই দিতে হবে কিনা! আসলে এরকম কোন বিধি-নিষেধ নাই। ঘুরিয়ে ফিরিয়ে দিতেই পারি আমরা। ‘ginger’ এর জায়গায় 343, 570 এর জায়গায় ‘finger’ দিয়ে দেখা যাক:

>>> b
['rice', 'potato', 'ginger', 'cucumber', 570, 3.1416]
>>> b[5] = 23486.4678
>>> b
['rice', 'potato', 'ginger', 'cucumber', 570, 23486.4678]
>>> b[2] = 343
>>> b
['rice', 'potato', 343, 'cucumber', 570, 23486.4678]
>>> b[4] = 'finger'

কি চমৎকার! তাই না? এতক্ষণ তো পুরাতন জায়গায় নতুন আইটেম ঢোকাচ্ছিলাম আমরা। কিন্তু যদি সম্পূর্ণ নতুন জায়গায় নতুন একটা জিনিস ঢোকাতে চাই? আগের নিয়মে কি হবে?

>>> b
['rice', 'potato', 343, 'cucumber', 'finger', 23486.4678]
>>> b[6] = 'new'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

আমরা 6 নম্বর ইনডেক্সে ’new’ নামে নতুন একটা আইটেম অ্যাসাইন করতে চেয়েছিলাম। কিন্তু সাথে সাথে পাইথন IndexError থ্রো করে জানিয়ে দিল সম্ভব না। না, ঘাবড়ানোর কিছু নাই। আছে append() ফাংশন। এই ফাংশন ব্যবহার করে আমরা আমাদের লিস্টে যেকোন নতুন আইটেম ঢোকাতে পারি। দেখা যাক:

>>> b
['rice', 'potato', 343, 'cucumber', 'finger', 23486.4678]
>>> b.append('new')
>>> b
['rice', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new']

নতুন ’new’ আইটেমটা একেবারে শেষে যোগ হয়ে গেছে। append() ফাংশন দিয়ে কোন আইটেম যোগ করা হলে সেটা সবসময় লিস্টের শেষে যোগ হবে। কিন্তু আমাদের যদি মনে হয় যে না, আমরা শেষে নয় বরং 1 নম্বর ইনডেক্সে একটা আইটেম যোগ করব। তখন কি হবে? তখন আমাদের insert() ফাংশনটা ব্যবহার করতে হবে। এই ফাংশনের ভিতর আমাদের নতুন আইটেমটা যে ইনডেক্সে আমরা বসাতে চাই সেটার নম্বর আর নতুন আইটেমটা বলে দিতে হবে। একটা উদাহরণ দিলে ব্যাপারটা পরিষ্কার হয়ে যাবে:

>>> b
['rice', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new']
>>> b.insert(1, 'python')
>>> b
['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new']

1 নম্বর ইনডেক্সে আমরা ‘python’ নামের একটা নতুন আইটেম যোগ করেছি। আচ্ছা একটা জিনিস কি আমাদের কারো মাথায় চক্কর দিয়েছে যে কিভাবে একই সাথে একাধিক আইটেম যোগ করা যায়? append() ফাংশন দিয়ে এটা সম্ভব না। কারণ append() এক সাথে কেবল একটিমাত্র আইটেমই যোগ করতে পারে। তাই একাধিক আইটেম একসাথে যোগ করার জন্য আমাদেরকে extend() ফাংশন ব্যবহার করতে হবে। এই ফাংশনের ভিতরে সবগুলো আইটেমকে লিস্ট আকারে দেয়া হয়। তবে লিস্টের ভিতরে এরা লিস্ট হিসাবে নয়, বরং সিঙ্গেল আইটেম হিসাবে যোগ হয়। যেমন:

>>> b
['rice', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new']
>>> b.insert(1, 'python')
>>> b
['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new']
>>> b.extend(['a', 'b', 'c'])
>>> b
['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new', 'a', 'b', 'c']

এত ঝামেলারও কিন্তু আসলে দরকার হয় না। আমরা চাইলে বাংলা যোগের মত করে লিস্ট যোগ করতে পারি।

>>> b = ['rice', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new']
>>> b
['rice', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new']
>>> b + ['a', 'b', 'c']
['rice', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new', 'a', 'b', 'c']
>>> b
['rice', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new']
>>> b = b + ['a', 'b', 'c']
>>> b
['rice', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new', 'a', 'b', 'c']

আচ্ছা, যদি আমরা একইসাথে কয়েকটা লিস্ট আমাদের এই লিস্টে যোগ করতে চাই তবে কিভাবে করব? আপনারা চেষ্টা করুন। আমি বরং একটু বিশ্রাম নিই।

রিমুভ আইটেম #

লিস্ট থেকে আইটেম রিমুভ করার জন্য দুইটা জুতসই পদ্ধতি আছে। আমরা যে আইটেমটা রিমুভ করতে চাই সেটার ইনডেক্স নম্বর যদি আমরা জানি তবে del স্টেটমেন্ট ব্যবহার করতে পারি। আর যদি না জানি সেক্ষেত্রে remove() ফাংশনটা চমৎকার কাজ করবে। এইজন্য ফাংশনের ভিতর আমাদেরকে আইটেমটা দিয়ে দিতে হবে।

>>> b = ['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new', 'a', 'b', 'c']
>>> b
['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new', 'a', 'b', 'c']
>>> del b[3]
>>> b
['rice', 'python', 'potato', 'cucumber', 'finger', 23486.4678, 'new', 'a', 'b', 'c']
>>> b.remove('python')
>>> b
['rice', 'potato', 'cucumber', 'finger', 23486.4678, 'new', 'a', 'b', 'c']

যদি আমরা একেবারে শেষ আইটেমটা রিমুভ করতে চাই তবে কি করব? জানি তো ভাই, আমাদের অনেকের মাথার ভিতরেই ইতিমধ্যে নিচের প্রোগ্রামটা চক্কর দিচ্ছে।

>>> b = ['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new', 'a', 'b', 'c']
>>> b
['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new', 'a', 'b', 'c']
>>> del b[-1]
>>> b
['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new', 'a', 'b']

আমরা যারা del b[-1] স্টেটমেন্টটা বুঝতেছি না তাদের জন্য বলছি। এটা দ্বারা বুঝায় শেষ দিক থেকে প্রথমটা। তবে আমরা চাইলে কিন্তু আরো সহজে এই কাজটা করতে পারি। এজন্য আপনাকে pop() ফাংশনের সাহায্য নিতে হবে। এই ফাংশনের কাজ হল লিস্টের একেবারে শেষ আইটেমটা রিমুভ করে আউটপুট দেয়া বা রিটার্ন করা। যেমন:

>>> b
['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new', 'a', 'b']
>>> b.pop()
'b'
>>> b
['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new', 'a']
>>> b.pop()
'a'
>>> b
['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678, 'new']
>>> b.pop()
'new'
>>> b
['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678]

গোণাগুণি, খোঁজাখুঁজি #

একটা লিস্টে ঠিক কতগুলো আইটেম রয়েছে তা জানার জন্য আমরা len() ফাংশনটা ব্যবহার করতে পারি।

>>> b
['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678]
>>> len(b)
7

এখন যদি জিজ্ঞেস করা হয় যে এই ৭টা আইটেমের ভিতরে ‘potato’ আইটেমটা কতবার আছে? উত্তর দেয়ার জন্য আমাদের জানতে হবে count() ফাংশনের ব্যবহার। এই ফাংশনের ভিতর কোন আইটেম দিয়ে দেয়া হলে এটা আমাদেরকে ঐ আইটেমেটা কতবার আছে তা জানিয়ে দেয়। উদাহরণ দিলে বিষয়টা আরো পরিষ্কার হবে:

>>> b
['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678]
>>> b.count('potato')
1
>>> c = ['potato', 'a', 'b', 'potato', 'potato']
>>> c.count('potato')
3

উল্টাপাল্টা #

কখনো একটা লিস্টকে উল্টানোর বা রিভার্স করার দরকার হতে পারে। এজন্য আমরা reverse() ফাংশন ব্যবহার করতে পারি।

>>> b
['rice', 'python', 'potato', 343, 'cucumber', 'finger', 23486.4678]
>>> b.reverse()
>>> b
[23486.4678, 'finger', 'cucumber', 343, 'potato', 'python', 'rice']

সাজুগুজু #

একটা লিস্টে যদি শুধু স্ট্রিং বা সংখ্যাই থাকে তবে আমরা তাদেরকে সুন্দরভাবে সাজাতে পারি। এজন্য আমরা sort() ফাংশন ব্যবহার করব।

>>> a = [8, 3, 5, 1, 6, 2, 9, 7, 0, 4]
>>> a
[8, 3, 5, 1, 6, 2, 9, 7, 0, 4]
>>> a.sort()
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> b = ['b', 'c', 'a', ':', 'maateen']
>>> b.sort()
>>> b
[':', 'a', 'b', 'c', 'maateen']

আশা করি, আমরা সবাই বুঝেছি। তো চেষ্টা চালিয়ে যেতে থাকি। আরো প্রাকটিস করি। কি বলেন?

মন্তব্য করুন