কম্প্রিহেনশন

কম্প্রিহেনশন

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

  • আউটপুট এক্সপ্রেশন : আউটপুট ইটারেটরের প্রতিটি আইটেমের সৌন্দর্য কেমন হবে তা নির্ধারণ করে।

  • ইনপুট সিক্যুয়েন্স : আউটপুট এক্সপ্রেশনের উপাদানগুলো এখান থেকেই সাপ্লাই হবে।

  • কন্ডিশনাল লজিক (অপশনাল) : ইনপুট সিক্যুয়েন্স থেকে আইটেম ফিল্টার করার জন্য ব্যবহার হয়।

লিস্ট কম্প্রিহেনশন

লিস্ট কম্প্রিহেনশন হলো একটা এক লাইনের for লুপ যা সফলতার সাথে একটা লিস্ট ডেটা স্ট্রাকচার তৈরি করে। একটা উদাহরণ দেখা যাক -

>>> my_list = [i**2 for i in range(20) if i %2 == 0]
>>> my_list
[0, 4, 16, 36, 64, 100, 144, 196, 256, 324]

এখানে সম্পূর্ণ কোডের [i**2 for i in range(20) if i %2 == 0] অংশটা হচ্ছে আমাদের মাথাব্যথার কারণ। এটাকে ভেঙে বিশ্লেষণ করে দেখলে -

  • আউটপুট এক্সপ্রেশন: i**2

  • ইনপুট সিকুয়েন্স: for i in range(20)

  • কন্ডিশনাল লজিক (অপশনাল): if i % 2 == 0

আউটপুট এক্সপ্রেশন দিয়ে আমরা বলে দিচ্ছি i-এর বিভিন্ন মানের বর্গকে আমরা লিস্ট বানিয়ে my_list-এর মধ্যে রাখব। কিন্তু i-এর মান সাপ্লাই হবে কোথা থেকে? সহজ উত্তর, ইনপুট সিক্যুয়েন্স থেকে। ইনপুট সিক্যুয়েন্সে একটা ইটারেবল অবজেক্টকে (এ ক্ষেত্রে range(20)) ফর লুপ দিয়ে ইটারেট করা হয়। প্রতিটি আইটেম i-এর এক একটি মান। মোটামুটি এই দুটি জিনিস হলেই হয়ে যায়। তবে অপশনাললি আমরা একটা কন্ডিশন বসিয়েছি। কন্ডিশন হলো i-এর মান 2 দ্বারা নিঃশেষে বিভাজ্য হবে। সে জন্য ইটারেটরের ভেতর যেই মানগুলো 2 দ্বারা বিভাজ্য শুধু সেগুলোই i-এর মান হিসেবে বিবেচিত হয়েছে।

সেট কমপ্রিহেনশন

সেট কমপ্রিহেনশনের একটা উদাহরণ দেখা যাক:

>>> a_list = ['Maateen', 'Khan', 'Maksudur', 'a', 'b', 'c']
>>> my_set = {i for i in a_list if len(i) > 1}
>>> my_set
{'Maksudur', 'Khan', 'Maateen'}

কাহিনি কিন্তু সেই আগের মতোই। শুধু আগে ছিল [] চিহ্ন আর এখন হলো {} চিহ্ন। বাদ বাকি জিনিস কিন্তু সব একই।

ডিকশনারি কমপ্রিহেনশন

ডিকশনারি কমপ্রিহেনশনের একটা উদাহরণ দেখা যাক।

>>> a_list = ['name', 'country', 'career']
>>> b_list = ['Maateen', 'Bangladesh', 'TeleTalk']
>>> my_dict = {i : j for i, j in zip(a_list, b_list)}
>>> my_dict
{'career': 'TeleTalk', 'country': 'Bangladesh', 'name': 'Maateen'}

এখানে zip() ফাংশন ব্যবহার করে আমরা দুটি লিস্টকে সমান্তরালভাবে ইটারেট করেছি। zip() ফাংশনের বিষয়ে একটু জানাশোনা থাকা দরকার আমাদের। এই ফাংশন একাধিক ইটারেবল প্যারামিটার হিসেবে নেয়, কিন্তু রিটার্ন করে কেবলমাত্র একটি ইটারেটর (টাপলের), যেখানে n-তম টাপলে প্যারামিটার হিসেবে নেওয়া প্রতিটি ইটারেবলের n-তম আইটেম থাকে। একটি উদাহরণ দিলে বিষয়টি আরও পরিষ্কার হবে।

>>> a = [i for i in range(11)]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> b = [i for i in range(11,21)]
>>> b
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> c = zip(a, b)
>>> c
<zip object at 0x7f612d0bde88>
>>> list(c)
[(0, 11), (1, 12), (2, 13), (3, 14), (4, 15), (5, 16), (6, 17), (7, 18), (8, 19), (9, 20)]

এখন আমরা দেখব, কীভাবে ডিকশনারি কম্প্রিহেনশন কাজে লাগানো যায় -

>>> my_dict = {'career': 'TeleTalk', 'country': 'Bangladesh', 'name': 'Maateen'}
>>> my_dict
{'career': 'TeleTalk', 'country': 'Bangladesh', 'name': 'Maateen'}
>>> new_dict = {key:value for value, key in my_dict.items()}
>>> new_dict
{'Bangladesh': 'country', 'TeleTalk': 'career', 'Maateen': 'name'}

আমরা আমাদের ডিকশনারির কি এবং ভ্যালুকে সোয়াপ করেছি অর্থাৎ কি-কে বানিয়েছি ভ্যালু আর ভ্যালুকে বানিয়েছি কি। আসলে এ রকম কিছু কাজে ডিকশনারি কম্প্রিহেনশন খুবই দরকারি জিনিস।

comments powered by Disqus