একটি লিস্ট ফ্ল্যাটেন করা বলতে একটি লিস্ট থেকে একটি ডাইমেনশন সরিয়ে ফেলা। ডাইমেনশন বলতে একটি লিস্টে কোনো আইটেম লোকেট করার জন্য প্রয়োজনীয় অতিরিক্ত কো-অর্ডিনেট। আপনি একটি পাইথন লিস্টকে লিস্ট কমপ্রিহেনশন, নেস্টেড ফর লুপ, বা itertools.chain() মেথড ব্যবহার করে ফ্ল্যাটেন করতে পারেন।
পাইথন ফ্ল্যাটেন লিস্ট
একটি পাইথন লিস্ট একাধিক ডাইমেনশন ধারণ করতে পারে। এর মানে হলো লিস্টের ভিতরে লিস্ট। এই লিস্টগুলো, जिन्हেকুকে কখনও নেস্টেড লিস্ট বলা হয়, আবার একটি সাধারণ লিস্টে রূপান্তর করা যায়।
এর মানে আপনি লিস্টের ভিতরের লিস্ট থেকে সব মানগুলো একটি একক লিস্টে সরিয়ে আনতে পারেন। লিস্ট অফ লিস্টকে একটি লিস্টে রূপান্তর করাকে ফ্ল্যাটেনিং অ্যা লিস্ট বলা হয়।
পাইথন লিস্ট ফ্ল্যাটেন করার তিনটি পদ্ধতি
পাইথন লিস্ট ফ্ল্যাটেন করার তিনটি পদ্ধতি রয়েছে:
- লিস্ট কমপ্রিহেনশন ব্যবহার করে।
- নেস্টেড ফর লুপ ব্যবহার করে।
itertools.chain()মেথড ব্যবহার করে।
এই গাইডে আমরা লিস্ট কমপ্রিহেনশন, ফর লুপ, এবং itertools.chain() মেথড ব্যবহার করে লিস্ট ফ্ল্যাটেন করার পদ্ধতি আলোচনা করব। দুটি উদাহরণের মাধ্যমে চলে যাব যাতে আপনি নিজের প্রোগ্রামে লিস্ট ফ্ল্যাটেন করতে শুরু করতে পারেন।
লিস্ট কমপ্রিহেনশন দিয়ে পাইথন ফ্ল্যাটেন লিস্ট
একটি পাইথন লিস্ট কমপ্রিহেনশন একটি বিদ্যমান লিস্টের কন্টেন্টের উপর ভিত্তি করে একটি লিস্ট সংজ্ঞায়িত করে। আপনি কমপ্রিহেনশনের ভিতরে কন্ডিশন বা পরিবর্তন নির্দিষ্ট করে আপনার নতুন লিস্টে যাওয়া প্রতিটি উপাদান কাস্টমাইজ করতে পারেন।
কমপ্রিহেনশন একটি ফর লুপ ব্যবহার করে একটি লিস্টের ওপর ইটারেট করে এবং একটি নতুন লিস্ট জেনারেট করার সিনট্যাক্টিক শুগার। এর মানে এটা ফর লুপের মতোই ফাউন্ডামেন্টালি কাজ করে কিন্তু ভিন্ন সিনট্যাক্স ব্যবহার করে।
লিস্ট কমপ্রিহেনশনের সিনট্যাক্স:
numbers = [1, 2, 3] new_numbers = [number * 2 for number in numbers]
এই কমপ্রিহেনশন আমাদের numbers লিস্টের প্রতিটি সংখ্যাকে ২ দিয়ে গুণ করে।
উদাহরণ: লিস্ট কমপ্রিহেনশন দিয়ে ফ্ল্যাটেন লিস্ট
আমাদের একটি লিস্ট অফ লিস্ট আছে যেটি একটি রেস্টুরেন্টে উপলব্ধ বিভিন্ন স্যান্ডউইচ ফিলিং ধারণ করে। বর্তমানে আমাদের লিস্ট অফ লিস্ট এরকম:
foods = [
["Tomato and Cucumber", "Hummus, Beetroot, and Lettuce"],
["Cheese", "Egg"],
["Ham", "Bacon", "Chicken Club", "Tuna"]
]
প্রথম লিস্টে ভেগান স্যান্ডউইচ ফিলিং; দ্বিতীয় লিস্টে ভেজিটেরিয়ান স্যান্ডউইচ ফিলিং; তৃতীয় লিস্টে মাংস সম্বন্ধীয় সব স্যান্ডউইচ ফিলিং।
আমরা এই লিস্টকে খাদ্য পণ্যের একটি একক লিস্টে পরিবর্তন করতে চাই। এক ডাইমেনশনের লিস্টের সাথে কাজ করা দুই ডাইমেনশনের চেয়ে সহজ। এই লিস্টে একাধিক ডাইমেনশন রাখার কোনো প্রয়োজন নেই। আমাদের লিস্ট থেকে সেকেন্ড ডাইমেনশন সরিয়ে ফেলতে আমরা লিস্ট কমপ্রিহেনশন ব্যবহার করতে পারি:
new_foods = [food for sublist in foods for food in sublist] print(new_foods)
এই লিস্ট কমপ্রিহেনশন foods পাইথন ভেরিয়েবলের প্রতিটি লিস্টের ওপর ইটারেট করে। প্রতিটি মান তারপর একটি মেইন লিস্টে যোগ হয়। একবার আমাদের লিস্ট জেনারেট হলে, আমরা সেটিকে কনসোলে প্রিন্ট করি।
কোডটি রান করলে কী হয় দেখি:
['Tomato and Cucumber', 'Hummus, Beetroot, and Lettuce', 'Cheese', 'Egg', 'Ham', 'Bacon', 'Chicken Club', 'Tuna']
আমাদের লিস্ট অফ লিস্ট সফলভাবে একটি ফ্ল্যাট লিস্টে রূপান্তরিত হয়েছে। সব উপাদান এখন তিনটি লিস্টের বদলে একটি লিস্টে আছে।
নেস্টেড ফর লুপ দিয়ে পাইথন ফ্ল্যাটেন লিস্ট
আমরা একই ফলাফল নেস্টেড পাইথন ফর লুপ দিয়েও অর্জন করতে পারি। নেস্টেড ফর লুপ বলতে একটি ফর লুপের ভিতরে আরেকটি ফর লুপ বুঝায়। আমাদের লিস্ট কমপ্রিহেনশন উপরের ফর লুপের আরেকটি রিপ্রেজেন্টেশন:
new_foods = []
for sublist in foods:
for food in sublist:
new_foods.append(food)
print(new_foods)
আমাদের কোড দুটি ফর লুপ ব্যবহার করে অরিজিনাল লিস্ট অফ লিস্টের প্রতিটি লিস্টের প্রতিটি লিস্ট আইটেমের ওপর ইটারেট করে। কোডটি রান করি:
['Tomato and Cucumber', 'Hummus, Beetroot, and Lettuce', 'Cheese', 'Egg', 'Ham', 'Bacon', 'Chicken Club', 'Tuna']
আমাদের প্রোগ্রাম লিস্ট কমপ্রিহেনশনের মতো একই ফলাফল রিটার্ন করেছে। অধিকাংশ কেসে, নেস্টেড ফর লুপের চেয়ে লিস্ট কমপ্রিহেনশন बेटার সমাধান। লিস্ট কমপ্রিহেনশন ছোট এবং এই কেসে নেস্টেড ফর লুপ চেয়ে পড়তে সহজ।
Itertools ব্যবহার করে পাইথন ফ্ল্যাটেন লিস্ট
Itertools পাইথন স্ট্যান্ডার্ড লাইব্রেরির একটি মডিউল। এই মডিউল একাধিক মেথড প্রদান করে, যাতে ইটারেবল অবজেক্ট এবং জেনারেটর নিয়ে কাজ করা সহজ হয়।
আমাদের উদ্দেশ্যে, আমরা শুধু chain() মেথডটি রেফার করব। এই মেথড একটি লিস্ট অফ লিস্ট গ্রহণ করে এবং একটি ফ্ল্যাটেনড লিস্ট রিটার্ন করে।
পাইথন ইম্পোর্ট স্টেটমেন্ট ব্যবহার করে itertools মডিউল ইম্পোর্ট করি:
import itertools
তারপর লিস্ট অফ লিস্ট ডিফাইন করি এবং chain() মেথড ব্যবহার করে লিস্ট ফ্ল্যাটেন করি:
foods = [
["Tomato and Cucumber", "Hummus, Beetroot, and Lettuce"],
["Cheese", "Egg"],
["Ham", "Bacon", "Chicken Club", "Tuna"]
]
new_foods = itertools.chain(*foods)
আমাদের কোডে, আমরা * সিম্বল ব্যবহার করে আমাদের লিস্ট আনপ্যাক করেছি। এটা আমাদের লিস্টকে ফাংশন আর্গুমেন্টে রূপান্তর করে যা chain() মেথড পার্স করতে পারে।
chain() মেথড একটি itertools.chain অবজেক্ট রিটার্ন করে। আমাদের ফ্ল্যাটেনড লিস্ট দেখতে, আমাদের এই অবজেক্টকে একটি লিস্টে রূপান্তর করতে হবে। এটা আমরা list() মেথড ব্যবহার করে করি:
print(list(new_foods))
কোডটি এক্সিকিউট করি:
['Tomato and Cucumber', 'Hummus, Beetroot, and Lettuce', 'Cheese', 'Egg', 'Ham', 'Bacon', 'Chicken Club', 'Tuna']
আমাদের কোড আমাদের লিস্ট ফ্ল্যাটেন করেছে।
যদিও itertools লিস্ট ফ্ল্যাটেন করার একটি ইফেক্টিভ পদ্ধতি, কিন্তু এটি আগের দুটি পদ্ধতির চেয়ে আরও এডভান্সড।
কারণ আপনাকে আপনার কোডে itertools ইম্পোর্ট করতে হয় যা একটি নতুন ডিপেন্ডেন্সি আনে। 게다가, chain() মেথডে আনপ্যাকিং ইনভল্ভড থাকে যা বুঝতে কঠিন হতে পারে।
উপসংহার
আপনি একটি পাইথন লিস্টকে লিস্ট কমপ্রিহেনশন, নেস্টেড ফর লুপ, এবং itertools.chain() মেথড ব্যবহার করে ফ্ল্যাটেন করতে পারেন। লিস্ট কমপ্রিহেনশন সবচেয়ে পাইথনিক মেথড এবং তাই অধিকাংশ কেসে প্রেফার করা হয়।
যদিও নেস্টেড ফর লুপ ইফেক্টিভ, কিন্তু সেগুলো লিস্ট কমপ্রিহেনশন চেয়ে বেশি লাইন কোড কনজিউম করে। itertools.chain() মেথড একইভাবে ইফেক্টিভ কিন্তু বেগানারদের জন্য বুঝতে কঠিন হতে পারে।
সাধারণত কোনো নতুন লাইব্রেরি — itertools — ইম্পোর্ট করার প্রয়োজন নেই, কারণ পাইথন আপনাকে লিস্ট ফ্ল্যাটেন করার সব টুলস দিয়েছে।
পাইথন সম্পর্কে আরও জানতে চান? আমাদের সম্পূর্ণ How to Learn Python গাইডটি চেক করুন। সেখানে এক্সপার্ট লার্নিং টিপস এবং শিখতে পারার টপ কোর্স ও বইয়ের তালিকা পাবেন।