কম্পিউটার টিউটোরিয়াল

পাইথন কালেকশন: ধাপে ধাপে গাইড

পাইথনের চারটি ডেটা কালেকশন টাইপ রয়েছে: লিস্ট, টাপল, সেট এবং ডিকশনারি। পাইথনের collections মডিউল আরও কিছু বিকল্প সরবরাহ করে, যেমন namedtuple, Counter, defaultdict, এবং ChainMap।


পাইথন চারটি কালেকশন ডেটা টাইপ অফার করে: লিস্ট, টাপল, সেট এবং ডিকশনারি। প্রতিটি ডেটা টাইপ নির্দিষ্ট পরিস্থিতিতে উপকারী।

উদাহরণস্বরূপ, যেহেতু লিস্ট পরিবর্তনযোগ্য, তাই আপনি একটি বিকশিত ছাত্রের নামের তালিকা সংরক্ষণ করতে এটি ব্যবহার করতে পারেন। আবার ধরা যাক আপনি আইসক্রিমের ফ্লেভারের একটি তালিকা সংরক্ষণ করতে চান যা কখনোই পরিবর্তন হবে না। একটি টাপল, যার কন্টেন্ট পরিবর্তন করা যাবে না, সেটি আরও উপযুক্ত হতে পারে।

প্রায়শই পাইথনে কাজ করার সময় আপনি দেখতে পাবেন যে এই ডেটা টাইপগুলো আপনার খুঁজে পাওয়া সব ফিচার দেয় না। خوشকის্মতিশ, পাইথনের একটি মডিউল রয়েছে যা ডেটা কালেকশনের সাথে সম্পর্কিত আরও উন্নত ফিচার অ্যাক্সেস করতে সাহায্য করে: পাইথন collections মডিউল।

পাইথন collections মডিউল বিল্ট-ইন কালেকশন অপশনগুলির কার্যকারিতা উন্নত করতে এবং ডেভেলপারদের ডেটা স্ট্রাকচারের সাথে কাজ করার জন্য আরও ফ্লেক্সিবিলিটি দিতে তৈরি করা হয়েছে। এই গাইডে, আমরা পাইথন collections মডিউলের বেসিকস ব্যাখ্যা করব এবং মডিউলের চারটি সবচেয়ে সাধারণত ব্যবহৃত ডেটা স্ট্রাকচার অন্বেষণ করব।

কালেকশন রিফ্রেশার

কালেকশন হল কন্টেইনার ডেটা টাইপ যা ডেটা সংরক্ষণ করতে ব্যবহার করা হয়। পূর্বে আলোচনা করা হয়েছে, কালেকশন লিস্ট, সেট, টাপল এবং ডিকশনারি সংরক্ষণ করতে পারে। এই ডেটা টাইপগুলির প্রতিটির নিজস্ব বৈশিষ্ট্য রয়েছে।

লিস্ট

লিস্ট একটি অর্ডারড, মিউটেবল ডেটা টাইপ যা সময়ের সাথে সাথে পরিবর্তন হতে পারে এমন ডেটা সংরক্ষণ করতে ব্যবহার করা হয়। উদাহরণস্বরূপ, আপনি লিস্ট আইটেম যোগ করতে, মুছে ফেলতে এবং আপডেট করতে পারেন। লিস্টে ডুপ্লিকেট মান থাকতে পারে। আপনি ইনডেক্স নম্বর ব্যবহার করে লিস্টের পৃথক আইটেম রেফারেন্স করতে পারেন।

পাইথনে লিস্ট ডিক্লেয়ার করার একটি উদাহরণ নিচে দেওয়া হলো:

sandwiches = ["Cheese", "Ham", "Tuna", "Egg Mayo"]

টাপল

টাপল অর্ডারড এবং ইমিউটেবল ডেটা টাইপ। যদিও টাপলে ডুপ্লিকেট মান থাকতে পারে, কিন্তু এর মান পরিবর্তন করা যায় না। টাপল কার্লি ব্র্যাকেট দিয়ে ঘেরা থাকে।

পাইথন টাপলের একটি উদাহরণ:

sandwiches = ("Cheese", "Ham", "Tuna", "Egg Mayo")

সেট

সেট হল আনঅর্ডারড লিস্ট। এগুলো স্কোয়ার ব্র্যাকেট দিয়ে ডিক্লেয়ার করা হয়। লিস্টের বিপরীতে, সেটের ইনডেক্স মান নেই এবং এতে ডুপ্লিকেট এন্ট্রি থাকতে পারে না।

পাইথন সেটের একটি উদাহরণ:

sandwiches = {"Cheese", "Ham", "Tuna", "Egg Mayo"}

ডিকশনারি

ডিকশনারি আনঅর্ডারড, পরিবর্তনযোগ্য ডেটা টাইপ যা ইনডেক্স করা যায়। ডিকশনারির প্রতিটি আইটেমের একটি কী এবং একটি মান থাকে।

পাইথন ডিকশনারি এন্ট্রির একটি উদাহরণ:

sandwich = { "name": "Cheese", "price": 8.95 }

এই চারটি ডেটা টাইপের পাইথনে ব্যাপক ব্যবহার রয়েছে। তবে, আপনি যদি পাইথন কন্টেইনার ডেটা টাইপের সাথে আরও উন্নত অপারেশন করতে চান, তবে পাইথন collections মডিউল বিবেচনা করা উচিত।

Collections মডিউল

পাইথন collections মডিউল ਵਿੱਚ বেশ কিছু স্পেশালাইজড ডেটা স্ট্রাকচার রয়েছে যা পাইথনের বিল্ট-ইন কন্টেইনারদের পাশাপাশি—বা বিকল্প হিসেবে—ব্যবহার করা যায়। যেহেতু collections একটি মডিউল, তাই আমাদের প্রোগ্রামে এটি ইম্পোর্ট করতে হবে। তবে এটি পাইথনে বিল্ট-ইন, তাই কোনো এক্সটার্নাল লাইব্রেরি ইম্পোর্ট করতে হবে না।

এই আর্টিকেলে, আমরা collections মডিউলের চারটি সবচেয়ে সাধারণত ব্যবহৃত ডেটা স্ট্রাকচার নিয়ে আলোচনা করব। এগুলো হলো:

  • Counter
  • namedtuple
  • defaultdict
  • ChainMap

Counter

Counter() ডিকশনারি অবজেক্টের একটি সাবক্লাস এবং হ্যাশেবল অবজেক্ট গণনা করতে ব্যবহার করা হয়। Counter() ফাংশন একটি ইটারেবল আর্গুমেন্ট হিসেবে নেয় এবং একটি ডিকশনারি রিটার্ন করে।

মান लीজিয়ে, জানুয়ারি মাসের স্যান্ডউইচ অর্ডারের একটি লিস্ট আছে এবং আমরা জানতে চাই সে মাসে কতটি BLT স্যান্ডউইচ বিক্রি হয়েছে। এটি জানতে আমরা Counter() ফাংশন ব্যবহার করতে পারি।

কোড উদাহরণ:

from collections import Counter
sandwich_sales = ["BLT", "Egg Mayo", "Ham", "Ham", "Ham", "Cheese", "BLT", "Cheese"]
our_counter = Counter(sandwich_sales)
print(our_counter["BLT"])

প্রোগ্রাম আউটপুট: 2।

এখানে কোডটি ধাপে ধাপে ব্যাখ্যা করা হলো।

প্রথম লাইনে, আমরা collections থেকে Counter ফাংশন ইম্পোর্ট করেছি। collections একটি মডিউল হবার কারণে এটি করতে হয়। তারপর, আমরা sandwich_sales অ্যারে ডিক্লেয়ার করেছি, যা জানুয়ারিতে কতগুলো স্যান্ডউইচ বিক্রি হয়েছে তা সংরক্ষণ করে।

পরবর্তী লাইনে, আমরা our_counter ভ্যারিয়েবল ডিক্লেয়ার করেছি এবং এতে Counter(sandwich_sales) ফাংশন অ্যাসাইন করেছি। এটি আমাদের our_counter রেফারেন্স করার সময় Counter() ফাংশনের ফলাফল অ্যাক্সেস করতে দেয়।

শেষে, আমরা print(our_counter["BLT"]) ব্যবহার করে প্রিন্ট করেছি যে আমাদের ডিকশনারিতে কতগুলো স্যান্ডউইচ BLT এর সমান। এই কেসে উত্তর ছিল 2।

namedtuple

namedtuple() মেথড টাপলে প্রতিটি পজিশনের জন্য নাম সহ একটি টাপল রিটার্ন করে। স্ট্যান্ডার্ড টাপলের সাথে কাজ করার সময়, পৃথক মান অ্যাক্সেস করার একমাত্র উপায় হলো টাপলের ইনডেক্স নম্বর রেফারেন্স করা। বড় টাপলের সাথে কাজ করলে এটি দ্রুত বিভ্রান্তিকর হয়ে যেতে পারে।

namedtuple() মেথড ব্যবহার করে স্যান্ডউইচের নাম এবং প্রাইস সংরক্ষণ করার উদাহরণ:

from collections import namedtuple
Sandwich = namedtuple("Sandwich", "name, price")
first_sandwich = Sandwich("Chicken Teriyaki", "$3.00")
print(first_sandwich.price)

প্রোগ্রাম আউটপুট: $3.00।

কোডটি ভাঙে ব্যাখ্যা: প্রথম লাইনে, আমরা collections মডিউল থেকে namedtuple ইম্পোর্ট করেছি। পরবর্তী লাইনে, আমরা Sandwich নামে টাপল তৈরি করেছি এবং এতে দুটি হেডার অ্যাসাইন করেছি: name এবং price। এটি আমাদের পরে কোডে এই হেডার ব্যবহার করে টাপলের মান রেফারেন্স করতে সক্ষম করে। এরপর, আমরা first_sandwich ভ্যারিয়েবল ডিক্লেয়ার করেছি, যেটি আমরা টাপল আইটেম Chicken Teriyaki অ্যাসাইন করেছি।

শেষে, আমরা first_sandwich এর প্রাইস প্রিন্ট করেছি, যা এই কেসে $3.00।

আপনি লিস্ট ব্যবহার করেও namedtuple() তৈরি করতে পারেন। উদাহরণ:

second_sandwich = Sandwich._make(["Spicy Italian", "$3.75"])
print(second_sandwich.name)

প্রোগ্রাম আউটপুট: Spicy Italian। এই উদাহরণে, আমরা আমাদের Sandwich আইটেমের পাশাপাশি _make ব্যবহার করেছি যাতে বোঝা যায় আমরা আমাদের লিস্টকে একটি namedtuple() এ রূপান্তর করতে চাই।

defaultdict

defaultdict() মেথড একটি পাইথন ডিকশনারি তৈরি করতে ব্যবহার করা হয় যা অস্তিত্বহীন অবজেক্ট অ্যাক্সেস করার সময় KeyError থ্রো করে না। এর বদলে, যদি আপনি একটি অস্তিত্বহীন অবজেক্ট রেফারেন্স করেন, তবে ডিকশনারি একটি প্রিডিফাইন্ড ডেটা টাইপ রিটার্ন করবে।

defaultdict() মেথড ব্যবহার করে একটি ডিকশনারি ডিক্লেয়ার করার উদাহরণ যেটি অস্তিত্বহীন অবজেক্ট রেফারেন্স করলে str রিটার্ন করবে:

from collections import defaultdict
sandwiches = defaultdict(str)
sandwiches[0] = "Ham and Cheese"
sandwiches[1] = "BLT"
print(sandwiches[1])
print(sandwiches[2])

প্রোগ্রাম আউটপুট:

BLT // এটি একটি ব্ল্যাঙ্ক লাইন

উপরের উদাহরণে, আমরা ইনডেক্স পজিশন 0 এবং 1 এ মান সহ একটি ডিকশনারি তৈরি করেছি। যখন আমরা sandwiches[1] প্রিন্ট করি, তখন দেখি আমাদের ডিকশনারি মানগুলো সংরক্ষণ করেছে। কিন্তু, যখন আমরা ইনডেক্স ভ্যালু 2 এর সাথে যুক্ত আইটেম প্রিন্ট করতে চাই, প্রোগ্রাম একটি ব্ল্যাঙ্ক লাইন রিটার্ন করে কারণ সেটি কোনো মান অ্যাসাইন করা নেই।

স্ট্যান্ডার্ড ডিকশনারিতে, প্রোগ্রাম KeyError রিটার্ন করত। তবে, defaultdict ব্যবহার করার কারণে, প্রোগ্রাম পরিবর্তে ডিকশনারি তৈরি করার সময় আমরা যেটি স্পেসিফাই করেছি সে ডেটা টাইপ রিটার্ন করে। উপরের উদাহরণে, আমরা বলেছি যে যেকোনো ইনভ্যালিড কী str রিটার্ন করবে, কিন্তু আমরা এটি ইন্টিজার বা অন্য যেকোনো বৈধ ডেটা টাইপ রিটার্ন করতে কোড করতে পারতাম।

এই ফাংশন তখন উপকারী হয়ে ওঠে যখন আপনি একটি ডিকশনারির সাথে একাধিক আইটেমে অপারেশন করছেন কিন্তু অপারেশনটি প্রতিটি আইটেমে কাজ নাও করতে পারে। আপনার প্রোগ্রাম এরর রিটার্ন করার বদলে, defaultdict() একটি ডিফল্ট মান রিটার্ন করবে এবং চলতে থাকবে।

ChainMap

ChainMap() মেথড দুটি বা ততোধিক ডিকশনারি কম্বাইন করতে ব্যবহৃত হয়; এটি ডিকশনারির একটি লিস্ট রিটার্ন করে। উদাহরণস্বরূপ, ধরুন আমাদের দুটি মেনু আছে—একটি স্ট্যান্ডার্ড মেনু এবং একটি সিক্রেট মেনু—যেগুলো আমরা একসাথে মার্জ করে একটি বড় মেনু বানাতে চাই। এটি করার জন্য আমরা ChainMap() ফাংশন ব্যবহার করতে পারি।

ChainMap() ব্যবহার করে স্ট্যান্ডার্ড এবং সিক্রেট মেনু মার্জ করার উদাহরণ:

from collections import ChainMap
standard_menu = {
    "BLT": "$3.05",
    "Roast Beef": "$3.55",
    "Cheese": "$2.85",
    "Shrimp": "$3.55",
    "Ham": "$2.85"
}
secret_menu = {
    "Steak": "$3.60",
    "Tuna Special": "$3.20",
    "Turkey Club": "$3.20"
}
menu = ChainMap(standard_menu, secret_menu)
print(menu)

আমাদের কোড একটি ChainMap অবজেক্ট রিটার্ন করে যা আমাদের দুটি মেনু একসাথে মার্জ করেছে, নিচের মতো:

ChainMap({'BLT': '$3.05', 'Roast Beef': '$3.55', 'Cheese': '$2.85', 'Shrimp': '$3.55', 'Ham': '$2.85'}, {'Steak': '$3.60', 'Tuna Special': '$3.20', 'Turkey Club': '$3.20'})

আমরা আমাদের ChainMap-এ প্রতিটি মান এর কী নাম দিয়ে রেফারেন্স করে অ্যাক্সেস করতে পারি। উদাহরণস্বরূপ, BLT স্যান্ডউইচের প্রাইস রিট্রিভ করার জন্য কোড লাইন:

print(menu["BLT"])

প্রোগ্রাম আউটপুট: $3.05

এছাড়া, গুরুত্বপূর্ণ নোট: ChainMap আপডেট হয়ে যায় যখন এতে থাকা ডিকশনারিগুলো আপডেট হয়। তাই, আপনি standard_menu বা secret_menu ডিকশনারিতে কোনো মান পরিবর্তন করলে, ChainMap অবজেক্টটিও আপডেট হয়ে যাবে। উদাহরণ:

print(menu)
standard_menu["BLT"] = "$3.10"
print(menu)

আমাদের কোড রিটার্ন করে:

ChainMap({'BLT': '$3.10', 'Roast Beef': '$3.55', 'Cheese': '$2.85', 'Shrimp': '$3.55', 'Ham': '$2.85'}, {'Steak': '$3.60', 'Tuna Special': '$3.20', 'Turkey Club': '$3.20'})

দেখতে পাচ্ছেন, আমাদের BLT-এর প্রাইস $3.05 থেকে $3.10 এ পরিবর্তন হয়েছে কারণ আমরা আমাদের standard_menu ডিকশনারিতে এর প্রাইস পরিবর্তন করেছি।

ChainMap অবজেক্টটিতে দুটি ফাংশন রয়েছে যা একটি অবজেক্ট থেকে কী বা মান রিট্রিভ করতে ব্যবহার করা যায়। আমরা keys() এবং values() মেথড ব্যবহার করে এটি ইলাস্ট্রেট করতে পারি। এই মেথডগুলো আমাদের ডেটার কী (যেগুলো আমরা একটি নির্দিষ্ট মান রেফারেন্স করতে ব্যবহার করতে পারি) এবং সেগুলোর অ্যাসাইন করা মানগুলো রিটার্ন করে:

print(list(menu.keys()))
print(list(menu.values()))

আমাদের কোড নিচের আউটপুট রিটার্ন করে:

['Steak', 'Tuna Special', 'Turkey Club', 'BLT', 'Roast Beef', 'Cheese', 'Prawn', 'Ham']
['$3.60', '$3.20', '$3.20', '$3.05', '$3.55', '$2.85', '$3.55', '$2.85']

যখন আমরা উপরে keys() এবং values() মেথড ব্যবহার করেছি, আমাদের কোড আমাদের ChainMap অবজেক্টের প্রতিটি আইটেমের কী এবং মান রিটার্ন করল।

এছাড়া, আপনি new_child() মেথড ব্যবহার করে একটি ChainMap অবজেক্টে নতুন ডিকশনারি যোগ করতে পারেন। ধরুন, আমাদের স্যান্ডউইচ শেফ একটি টেস্ট মেনুতে নতুন স্যান্ডউইচ ট্রাই করছেন এবং 그중 দুটি আমাদের নতুন মেনুতে যোগ করতে চান। এটি অর্জনের জন্য আমরা নিচের কোড ব্যবহার করতে পারি:

test_menu = {
    "Veggie Deluxe": "$3.00",
    "House Club Special": "$3.65"
}
new_menu = menu.new_child(test_menu)
print(new_menu)

আমাদের কোড একটি আপডেটেড ChainMap রিটার্ন করে যেখানে আমাদের নতুন স্যান্ডউইচগুলো ডিকশনারির শুরুতে আছে, নিচের মতো:

ChainMap({'Veggie Deluxe': '$3.00', 'House Club Special': '$3.65'}, {'BLT': '$3.05', 'Roast Beef': '$3.55', 'Cheese': '$2.85', 'Shrimp': '$3.55', 'Ham': '$2.85'}, {'Steak': '$3.60', 'Tuna Special': '$3.20', 'Turkey Club': '$3.20'})

উপসংহার

আমরা পাইথন collections মডিউল ব্যবহার করে পাইথনের বিল্ট-ইন কালেকশনগুলো এক্সটেন্ড করতে পারি এবং কাস্টম ডেটা স্ট্রাকচার মেথড অ্যাক্সেস করতে পারি। এটি তখন সহায়ক হয় যখন আপনি একটি কালেকশন ডেটা টাইপ (যেমন লিস্ট বা টাপল) এর সাথে কাজ করছেন কিন্তু একটি নির্দিষ্ট ফাংশন পфорম করতে চান যা ভ্যানিলা (বা plain) পাইথনে নেই।

এই গাইডে, উদাহরণ দিয়ে আমরা পাইথনে কালেকশন কীভাবে ব্যবহার করতে হয় এবং লাইব্রেরির চারটি প্রধান মেথড: Counter, namedtuple, defaultdict, এবং ChainMap নিয়ে আলোচনা করেছি।

এখন আপনি পাইথন collections মডিউলের সাথে এক্সপার্টের মত কাজ করার জন্য প্রস্তুত!

  1. পাইথন ইন্টারপ্রেটার: ধাপে ধাপে গাইড

  2. পাইথন try-except: ধাপে ধাপে গাইড

  3. পাইথনে পাওয়ার (ক্ষমতা) ক্যালকুলেশন: ** অপারেটর এবং pow() ফাংশন

  4. পাইথনে ফাইল রিনেম: একটি ধাপে ধাপে গাইড