পাইথন কম্প্রিহেনশন্স
পাইথন কম্প্রিহেনশন্স খুবই মজার একটি বিষয়। কম্প্রিহেনশন্স লিখায় তুমি যত পারদর্শী হবে নিজেকে ততটা স্পেশাল প্রোগ্রামার মনে হবে।কারণ কম্প্রিহেনশন লিখা টা একটু জটিল। এই অধ্যায়ে আমরা পাইথন কম্প্রিহেনশন্স সম্পর্কে আলোচনা করব।
লিস্ট কম্প্রিহেনশন্স
বেসিক সিনট্যাক্সঃ
(values) = [(expression) for in (data) in (collection)]
এই এক্সপ্রেশনকে বোঝার জন্য আমরা এর সাধারন পদ্ধতি দেখিঃ
values = []
for (data) in (collection):
(values).append((expression))
এখানে expression এর ভ্যালু data হতে পারে বা যে কোন অপারেশন হতে পারে।
>>> numbers = [1,2,3,4,5,6]
>>> numbers_list = []
>>> for n in numbers:
numbers_list.append(n)
>>> print(numbers_list)
[1, 2, 3, 4, 5, 6]
এই প্রোগ্রামটাকে যদি কম্প্রিহেনশন ব্যবহার করে লিখা হয় তাহলে এমন হবে,
>>> numbers_list = [n for n in numbers]
>>> numbers_list
[1, 2, 3, 4, 5, 6]
এখানে প্রথম n হল expression এবং দ্বিতীয় n হল data এর ভ্যালু আবার যখন if ব্যবহার করব তখন আমাদের সিনট্যাক্স টা হবে এমনঃ [(expression) for (data) in (collection) if (condition)] এর সাধারন পদ্ধতি হলঃ
(values) = []
for (data) in (collection):
if (condition):
(values).append((expression))
উদাহরণ ২:
>>>even_numbers = []
>>>even_numbers = [ n for n in numbers if n%2 == 0 ]
[2, 4, 6] #output
এই সম্পূর্ন কোড কে আরও ছোট করে ১ লাইনে লিখা যায়।
>>>even_numbers = print(list([n for n in numbers if n%2 == 0]))
[2, 4, 6] #output
আমরা প্রথমে যে আউটপুট পাচ্ছি সেগুলোকে লিস্ট অবজেক্টে পরিবর্তন করে নিয়েছি এবং print() ফাংশনে পাস করে দিয়েছি।
উদাহরণ ৩:
my_list = []
for letter in 'abcd':
for num in numbers:
my_list.append((letter,num))
print(my_list)
এই প্রোগ্রাম লিখার জন্য নেস্টেড লিস্ট কম্প্রহেনশন ব্যবহার করতে হবে।
my_list=[(letter,num) for letter in 'abcd' for num in numbers ]
print(my_list)
ফর লুপ দুটোর স্থান পরিবর্তন করে আউটপুটের ভিন্নতার কারণ বিশ্লেষণ করার চেষ্টা কর।
ডিকশনারি কম্প্রিহেনশন্স
লিস্ট কম্প্রিহেনশনের মত একইভাবে ডিকশনারি কম্প্রিহেনশন ও ব্যবহার করা যায়। এটি পাইথন ৩ তে নতুন সংযোজন করা হয় এবং পরে পাইথন২ তে ও সংযোজন করা হয়। এর গঠনও লিস্ট কম্প্রিহেনশনের মতই । লিস্টের ক্ষেত্রে আমরা এক্সপ্রেশনের জায়গায় শুধুমাত্র ভ্যালু নিয়ে কাজ করেছি এখন আমাদের কি-ভ্যালু নিয়ে কাজ করতে হবে।
>>> dictionary = {'1':'a','2':'b','3':'c'}
>>> dictionary.keys()
dict_keys(['1', '2', '3'])
>>> dictionary.values()
dict_values(['a', 'b', 'c'])
>>> dictionary.items()
dict_items([('1', 'a'), ('2', 'b'), ('3', 'c')])
>>> sqaure_of_values = { key : value*2 for (key, value) in dictionary.items()}
>>> sqaure_of_values
{'1': 'aa', '2': 'bb', '3': 'cc'}
‘কী’র মান পরিবর্তন করা এবং লিস্ট কম্প্রিহেনশনের মত if স্টেট্মেন্ট ব্যবহার করার চেষ্টা কর। এখন আমরা দুটো লিস্ট থেকে কম্প্রিহেনশনের মাধ্যমে ডিকশনারি তৈরি করা দেখবঃ
>>> a = [1,2,3,4,5]
>>> b = ['a','b','c','d','e']
>>> dictionary = {key : value for key,value in zip(a,b)}
>>> dictionary
{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
এখানে a লিস্টের এলিমেন্টকে key এবং b লিস্টের এলিমেন্ট কে ভ্যলু হিসেবে নেয়া হয়েছে। এবং কি-ভ্যালুকে zip() ফাংশনে পাঠানো হয়েছে। zip() ফাংশন প্রতিবার একটি ইটারেবল অবজেক্ট রিটার্ন করে যা ডিকশনারি তে কনভার্ট হচ্ছে। যদিও এখানে এটি আমাদের আলোচনার বিষইয় না তারপর ও জেনে রাখা ভাল যে, zip() ফাংশন সবসময় নুন্যতম সংখ্যক এলিমেন্ট নিয়ে কাজ করে। অর্থ্যাৎ,যেকোন লিস্টের মধ্যে সবচেয়ে কমসংখ্যক এলিমেন্ট যে লিস্টে থাকবে zip() শুধু ততবার ই ইটারেশন চালাবে।
>>>numberList = [1, 2, 3]
>>> strList = [‘one’, ‘two’, ‘three’,’four’]
>>> dict(zip(numberList,strList))
{1: ‘one’, 2: ‘two’, 3: ‘three’}
>>> strList = [‘one’, ‘two’]
>>> dict(zip(numberList,strList))
{1: ‘one’, 2: ‘two’}
zip() ফাংশনে দুইয়ের অধিক ইটারেবল অবজেক্ট ও পাঠানো যায় এবং unzip ও করা যায়।
সেট কম্প্রিহেনশন্স
সেট কম্প্রিহেনশন্স অনেকটাই ডিকশনারি কম্প্রিহেনশনের মত। এটি সেট অবজেক্ট রিটার্ন করে।
সিন্ট্যাক্সঃ
{expression for variable in collection}
উদাহরন:
>>> {s for s in [1, 2, 1, 0]}
set([0, 1, 2])
>>> {s**2 for s in [1, 2, 1, 0]}
set([0, 1, 4])
>>> {s**2 for s in range(10)}
set([0, 1, 4, 9, 16, 25, 36, 49, 64, 81])
>>> {s for s in [1, 2, 3] if s % 2}
set([1, 3])
>>> {(m, n) for n in range(2) for m in range(3, 5)}
set([(3, 0), (3, 1), (4, 0), (4, 1)])