একটি list comprehension একটি বিদ্যমান লিস্ট থেকে একটি একক লাইনে একটি নতুন লিস্ট তৈরি করে — এটি ভাষার সবচেয়ে স্বতন্ত্রভাবে "Python" ফিচারগুলোর একটি, আর বাস্তব Python কোড এটি ক্রমাগত ব্যবহার করে।
এখানে একই কাজ — একটি লিস্টের প্রতিটি সংখ্যা স্কোয়ার করা — দুই উপায়ে লেখা:
# The long way, with a regular loop:
numbers = [1, 2, 3, 4, 5]
squared = []
for n in numbers:
squared.append(n ** 2)
print(squared) # [1, 4, 9, 16, 25]
# The same thing, as a list comprehension:
squared = [n ** 2 for n in numbers]
print(squared) # [1, 4, 9, 16, 25]প্যাটার্নটি হলো [expression for item in iterable] — এটি বাম থেকে ডানে পড়ুন "iterable-এর প্রতিটি item-এর জন্য, expression-এর ফলাফল" হিসেবে।
শেষে একটি ঐচ্ছিক if কোন আইটেমগুলো অন্তর্ভুক্ত হবে তা ফিল্টার করে — একটি একক এক্সপ্রেশনে ফিল্টারিং আর রূপান্তর একত্রিত করে:
numbers = [1, 2, 3, 4, 5, 6]
even_squared = [n ** 2 for n in numbers if n % 2 == 0]
print(even_squared) # [4, 16, 36]একই ধারণা একটি ডিকশনারি তৈরির জন্যও কাজ করে, এর বদলে { } আর একটি key: value জোড়া ব্যবহার করে:
names = ["priya", "amit", "sara"]
capitalized = {name: name.capitalize() for name in names}
print(capitalized) # {'priya': 'Priya', 'amit': 'Amit', 'sara': 'Sara'}উপরে দেখানো if ফিল্টার করে — এটা সিদ্ধান্ত নেয় একটি আইটেম আদৌ অন্তর্ভুক্ত হবে কিনা। এক্সপ্রেশনের আগে if/else বসালে এর বদলে কোন মান ব্যবহৃত হবে তা বদলায়, প্রতিটি আইটেম রেখে দিয়ে:
numbers = [1, 2, 3, 4, 5, 6]
labels = ["even" if n % 2 == 0 else "odd" for n in numbers]
print(labels) # ['odd', 'even', 'odd', 'even', 'odd', 'even'] — one label per number, none droppedঅবস্থানই এদের আলাদা করে চেনায়: লুপের পরে if ফিল্টার করে, এক্সপ্রেশনের আগে if/else রূপান্তর করে। কারো কোড দ্রুত দেখার সময় এই দুটো গুলিয়ে ফেলা একটি সহজ ভুল।
কখন একটি ব্যবহার করবেন না
একটি ছোট, সহজ রূপান্তরের জন্য একটি কম্প্রিহেনশন পাঠযোগ্যতার একটি জয়। একবার এর ভেতরের লজিক জটিল হয়ে গেলে — বেশ কয়েকটি কন্ডিশন, নেস্টেড লুপ, একটি মাল্টি-লাইন রূপান্তর — একটি সাধারণ for লুপ সাধারণত বেশি পরিষ্কার। ঠিক কোথায় সেই সীমা তার কোনো নিয়ম নেই; একটি কম্প্রিহেনশন বুঝতে যদি আপনাকে চোখ কুঁচকে তাকাতে হয়, তাহলে এটাই সংকেত যে এর বদলে একটি লুপ হিসেবে লেখা উচিত।