পাইথনে লিস্ট কম্প্রিহেনশন: এক লাইনে জাদু

পাইথন শেখার কিছুদিন পর একদিন হঠাৎ এমন কোড দেখবেন:
borgo = [x * x for x in range(10)]
প্রথমবার দেখে মনে হয় কেউ ইংরেজি বাক্য লিখে ফেলেছে। আসলে এটাই পাইথনের অন্যতম সুন্দর জিনিস: লিস্ট কম্প্রিহেনশন।
সাধারণ লুপ বনাম কম্প্রিহেনশন
সাধারণভাবে লিখলে:
borgo = []
for x in range(10):
borgo.append(x * x)
কম্প্রিহেনশনে:
borgo = [x * x for x in range(10)]
পড়ুন এভাবে: "০ থেকে ৯ পর্যন্ত প্রতিটা x এর জন্য x এর বর্গ নিয়ে একটা লিস্ট বানাও।" প্রায় বাংলা বাক্যের মতোই।
শর্ত যোগ করা
শুধু জোড় সংখ্যার বর্গ চাইলে:
jor_borgo = [x * x for x in range(20) if x % 2 == 0]
পরীক্ষায় পাস করা ছাত্রদের নাম বের করতে:
chhatro = [("রহিম", 78), ("করিম", 32), ("সুমি", 91), ("জয়", 45)]
pass_korechhe = [nam for nam, nombor in chhatro if nombor >= 40]
# ['রহিম', 'সুমি', 'জয়']
ডিকশনারি আর সেট কম্প্রিহেনশন
একই কৌশল ডিকশনারিতেও:
nombor_dict = {nam: nombor for nam, nombor in chhatro}
grade = {nam: ("A" if n >= 80 else "B" if n >= 60 else "C") for nam, n in chhatro}
আর ডুপ্লিকেট বাদ দিতে সেট:
shohor = ["ঢাকা", "চট্টগ্রাম", "ঢাকা", "সিলেট"]
alada = {s for s in shohor} # {'ঢাকা', 'চট্টগ্রাম', 'সিলেট'}
গতিও একটু বেশি

কম্প্রিহেনশন সাধারণত append সহ লুপের চেয়ে কিছুটা দ্রুত চলে। তবে লাখ লাখ সংখ্যা নিয়ে গণিত করলে NumPy ব্যবহার করুন; সেটা অনেক গুণ দ্রুত।
যখন জাদু ধাঁধা হয়ে যায়
এই কোডটা দেখুন:
r = [[y * 2 for y in x if y > 0] for x in data if len(x) > 3 and x[0] != 0]
কাজ করে, কিন্তু পড়তে গেলে মাথা ঘোরে। নিয়ম হলো:
- এক লাইনে না ধরলে বা দুইয়ের বেশি
for/ifলাগলে সাধারণ লুপ লিখুন। - ভেতরে জটিল লজিক থাকলে আলাদা ফাংশন বানিয়ে সেটার নাম দিন।
- শুধু সাইড-এফেক্টের জন্য (যেমন প্রিন্ট করা) কম্প্রিহেনশন ব্যবহার করবেন না।
def valid_row(x):
return len(x) > 3 and x[0] != 0
result = [double_positive(x) for x in data if valid_row(x)]
এখন একই কাজ, কিন্তু পড়ে বোঝা যায়।
শেষ কথা
লিস্ট কম্প্রিহেনশন হলো রান্নায় লবণের মতো: সঠিক পরিমাণে দিলে স্বাদ বাড়ে, বেশি দিলে খাওয়া যায় না। ছোট, পরিষ্কার রূপান্তরের জন্য এটা দারুণ। জটিল লজিকের জন্য সাধারণ লুপই ভালো বন্ধু। আজকেই নিজের কোডে একটা চার লাইনের লুপ খুঁজে বের করুন, আর দেখুন সেটা এক লাইনে সুন্দরভাবে লেখা যায় কি না।