Hot Post

6/recent/ticker-posts

Header Ads Widget

Python শেখার সিরিজ — পর্ব ৮ / ২০ (Dictionaries ও Sets)

🐍 Python শেখার সিরিজ — পর্ব ৮ / ২০
python learning

Dictionaries ও Sets
Key-Value পেয়ারে ডেটা সংরক্ষণ, Dictionary Methods, Set Operations — Union, Intersection, Difference সহ বাস্তব প্রজেক্ট
⏱ পড়তে সময় ~১৭ মিনিট 🎯 Beginner Friendly 🐍 Python 3.x

গত পর্বে আমরা List শিখেছি — Index দিয়ে ডেটা access করা। কিন্তু কিছু তথ্য নামে রাখলে বোঝা সহজ হয়। যেমন একজন মানুষের তথ্য রাখতে person[0] বলার চেয়ে person["naam"] বলা অনেক বেশি পরিষ্কার। এই সুবিধার জন্যই Python-এ আছে Dictionary

📖 Dictionary কী? — বাস্তব উদাহরণে

Dictionary হলো একটি Data Structure যেখানে ডেটা Key-Value পেয়ার হিসেবে সংরক্ষণ করা হয়। এটি বাস্তব জীবনের অভিধানের মতো — শব্দ (Key) দিয়ে তার অর্থ (Value) খোঁজা যায়।

student = {key: value, key: value, ...}
"naam"
:
"রাহিম"
"boyos"
:
22
"marks"
:
85.5
"passed"
:
True
বৈশিষ্ট্যমানে
Key-Value পেয়ারপ্রতিটি উপাদান একটি নাম (Key) ও মান (Value) দিয়ে গঠিত
Ordered (3.7+)Python 3.7 থেকে যে ক্রমে যোগ করা হয় সে ক্রমে থাকে
Mutableযোগ, বাদ, পরিবর্তন করা যায়
Key Uniqueএকই Key দুইবার থাকতে পারে না — দ্বিতীয়টি প্রথমটি overwrite করে
Value যেকোনোValue হতে পারে সংখ্যা, লেখা, List, এমনকি আরেকটি Dictionary
🛠️ Dictionary তৈরি ও Access করা

Dictionary তৈরি করতে Curly Braces { } ব্যবহার করো। Key ও Value-এর মাঝে কোলন (:) দাও।

Python — Dictionary তৈরি
# Dictionary তৈরি
student = {
    "naam":   "রাহিম",
    "boyos":  22,
    "shahor": "ঢাকা",
    "marks":  85.5,
    "passed": True
}

print(student)
print(f"ধরন: {type(student)}")
print(f"মোট Key: {len(student)}")

# Value Access — Key দিয়ে
print(student["naam"])    # রাহিম
print(student["boyos"])   # 22
print(student["marks"])   # 85.5

# get() দিয়ে Access — Key না থাকলে Error-এর বদলে None দেয়
print(student.get("email"))           # None
print(student.get("email", "নেই"))   # নেই (default মান)
✔ আউটপুট
{'naam': 'রাহিম', 'boyos': 22, 'shahor': 'ঢাকা', 'marks': 85.5, 'passed': True}
ধরন: <class 'dict'>
মোট Key: 5
রাহিম
22
85.5
None
নেই
⚠️

সরাসরি dict["key"] দিয়ে access করলে Key না থাকলে KeyError আসবে। তাই সবসময় dict.get("key") ব্যবহার করা নিরাপদ।

✏️ Dictionary Update ও Delete
Python — Update ও Delete
person = {"naam": "করিম", "boyos": 25, "shahor": "ঢাকা"}

# মান পরিবর্তন
person["boyos"] = 26
print(f"আপডেট বয়স: {person['boyos']}")

# নতুন Key-Value যোগ
person["pesa"]  = "ডেভেলপার"
person["email"] = "karim@mail.com"
print(person)

# del দিয়ে মুছে ফেলা
del person["email"]
print(f"email মুছার পর: {person}")

# pop() দিয়ে মুছে মান ফেরত নেওয়া
removed_city = person.pop("shahor")
print(f"বের হলো: {removed_city}")
print(person)
✔ আউটপুট
আপডেট বয়স: 26
{'naam': 'করিম', 'boyos': 26, 'shahor': 'ঢাকা', 'pesa': 'ডেভেলপার', 'email': 'karim@mail.com'}
email মুছার পর: {'naam': 'করিম', 'boyos': 26, 'shahor': 'ঢাকা', 'pesa': 'ডেভেলপার'}
বের হলো: ঢাকা
{'naam': 'করিম', 'boyos': 26, 'pesa': 'ডেভেলপার'}
🔨 গুরুত্বপূর্ণ Dictionary Methods
keys()

সব Key-এর তালিকা দেয়

values()

সব Value-এর তালিকা দেয়

items()

সব (Key, Value) tuple দেয়

get(k, default)

Key-এর Value নিরাপদে নেয়

update(dict2)

অন্য Dict মার্জ করে

pop(key)

Key মুছে Value ফেরত দেয়

popitem()

শেষ item মুছে ফেরত দেয়

setdefault(k,v)

Key না থাকলে default সেট করে

copy()

Dict-এর একটি কপি তৈরি করে

clear()

Dict সম্পূর্ণ খালি করে

Python — Dictionary Methods বিস্তারিত
product = {
    "naam":   "ল্যাপটপ",
    "brand":  "Dell",
    "dam":    65000,
    "stock":  15
}

# keys(), values(), items()
print("Keys:  ", list(product.keys()))
print("Values:", list(product.values()))
print("Items: ", list(product.items()))

# update() — দুটি Dict মার্জ করা
extra = {"warranty": "১ বছর", "color": "Silver"}
product.update(extra)
print(f"\nআপডেট হওয়া Product:\n{product}")

# setdefault() — Key না থাকলে default সেট
product.setdefault("rating", 4.5)
product.setdefault("naam", "অন্য নাম")  # naam আগেই আছে, পরিবর্তন হবে না
print(f"Rating: {product['rating']}")
print(f"Naam:   {product['naam']}")   # আগেরটাই থাকবে
✔ আউটপুট
Keys:   ['naam', 'brand', 'dam', 'stock']
Values: ['ল্যাপটপ', 'Dell', 65000, 15]
Items:  [('naam', 'ল্যাপটপ'), ('brand', 'Dell'), ('dam', 65000), ('stock', 15)]

আপডেট হওয়া Product:
{'naam': 'ল্যাপটপ', 'brand': 'Dell', 'dam': 65000, 'stock': 15, 'warranty': '১ বছর', 'color': 'Silver'}
Rating: 4.5
Naam:   ল্যাপটপ
🔁 Dictionary-তে Loop

Dictionary-র উপর Loop চালানোর তিনটি পদ্ধতি আছে।

Python — Dictionary Loop
scores = {
    "রাহিম":  85,
    "করিম":   72,
    "সালমা":  91,
    "নাসরিন": 78
}

# পদ্ধতি ১: শুধু Keys
print("ছাত্রদের নাম:")
for naam in scores:
    print(f"  {naam}")

# পদ্ধতি ২: শুধু Values
print("\nনম্বরগুলো:")
for score in scores.values():
    print(f"  {score}", end=" ")

# পদ্ধতি ৩: Key ও Value দুটোই (সবচেয়ে বেশি ব্যবহৃত)
print("\n\nরেজাল্ট:")
for naam, score in scores.items():
    grade  = "A+" if score >= 80 else "A" if score >= 70 else "B"
    print(f"  {naam:10} → {score}  ({grade})")
✔ আউটপুট
ছাত্রদের নাম:
  রাহিম
  করিম
  সালমা
  নাসরিন

নম্বরগুলো:
  85 72 91 78

রেজাল্ট:
  রাহিম      → 85  (A+)
  করিম       → 72  (A)
  সালমা      → 91  (A+)
  নাসরিন     → 78  (A)
📦 Nested Dictionary

Dictionary-র Value হিসেবে আরেকটি Dictionary রাখা যায়।

Python — Nested Dictionary
school = {
    "rahim": {
        "naam":  "রাহিম",
        "class": "দশম",
        "marks": {"bangla": 85, "english": 78, "math": 92}
    },
    "salma": {
        "naam":  "সালমা",
        "class": "নবম",
        "marks": {"bangla": 91, "english": 88, "math": 95}
    }
}

# Nested Access
print(school["rahim"]["naam"])          # রাহিম
print(school["rahim"]["marks"]["math"]) # 92

# সব ছাত্রের তথ্য দেখানো
print()
for id, info in school.items():
    m   = info["marks"]
    avg = sum(m.values()) / len(m)
    print(f"নাম: {info['naam']}, ক্লাস: {info['class']}, গড়: {avg:.1f}")
✔ আউটপুট
রাহিম
92

নাম: রাহিম, ক্লাস: দশম, গড়: 85.0
নাম: সালমা, ক্লাস: নবম, গড়: 91.3
⚡ Dictionary Comprehension

List Comprehension-এর মতো Dictionary-ও এক লাইনে তৈরি করা যায়।

Python — Dictionary Comprehension
# ১ থেকে ৫-এর বর্গ
squares = {x: x**2 for x in range(1, 6)}
print(squares)   # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# দুটি List থেকে Dictionary
keys   = ["naam", "boyos", "shahor"]
values = ["রাহিম", 22, "ঢাকা"]
person = {k: v for k, v in zip(keys, values)}
print(person)

# Condition সহ — শুধু পাস করা ছাত্র
all_scores = {"রাহিম": 85, "করিম": 28, "সালমা": 92, "জামাল": 25}
pass_scores = {k: v for k, v in all_scores.items() if v >= 33}
print(f"পাস করা ছাত্র: {pass_scores}")

# সব নম্বর ২ গুণ করা
doubled = {k: v * 2 for k, v in all_scores.items()}
print(f"দ্বিগুণ: {doubled}")
✔ আউটপুট
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
{'naam': 'রাহিম', 'boyos': 22, 'shahor': 'ঢাকা'}
পাস করা ছাত্র: {'রাহিম': 85, 'সালমা': 92}
দ্বিগুণ: {'রাহিম': 170, 'করিম': 56, 'সালমা': 184, 'জামাল': 50}
🔵 Set কী এবং কীভাবে তৈরি করে?

Set হলো অনন্য (unique) মানের একটি অসংগঠিত সংগ্রহ। Set-এ একই মান দুইবার রাখা যায় না — duplicate স্বয়ংক্রিয়ভাবে বাদ পড়ে।

বৈশিষ্ট্যমানে
Uniqueপ্রতিটি মান একবারই থাকতে পারে
Unorderedকোনো নির্দিষ্ট ক্রম নেই
Mutableযোগ ও বাদ করা যায়
No IndexingIndex দিয়ে Access করা যায় না
HashableList রাখা যায় না, Tuple রাখা যায়
Python — Set তৈরি
# Set তৈরি — Curly Braces { }
fruits = {"আম", "কলা", "লিচু", "আম"}  # "আম" দুইবার আছে
print(fruits)         # {'আম', 'কলা', 'লিচু'} — duplicate বাদ

# খালি Set — set() ব্যবহার করতে হবে ({}  নয়, সেটা dict!)
empty_set = set()
print(type(empty_set))   # <class 'set'>

# List থেকে Set — duplicate সরাতে দারুণ কাজে লাগে!
with_dup   = [1, 2, 3, 2, 4, 1, 5, 3]
unique     = list(set(with_dup))
print(f"আগে: {with_dup}")
print(f"পরে: {unique}")

# Set-এ যোগ ও বাদ
colors = {"লাল", "সবুজ"}
colors.add("নীল")       # একটি যোগ
colors.discard("লাল")  # বাদ (না থাকলে Error নেই)
print(colors)             # {'সবুজ', 'নীল'}
✔ আউটপুট
{'আম', 'কলা', 'লিচু'}
<class 'set'>
আগে: [1, 2, 3, 2, 4, 1, 5, 3]
পরে: [1, 2, 3, 4, 5]
{'সবুজ', 'নীল'}

সেরা ব্যবহার: List থেকে duplicate সরাতে list(set(my_list)) — এটি Python-এর সবচেয়ে সহজ এবং দ্রুত পদ্ধতি।

🔣 Set Operations — Union, Intersection, Difference

Set-এর সবচেয়ে শক্তিশালী দিক হলো গণিতের Set Theory-র Operations। এগুলো দিয়ে দুটি গ্রুপের মধ্যে মিল ও পার্থক্য খুঁজে বের করা যায়।

A | B
Union (মিলন)

A এবং B উভয়ের সব উপাদান একসাথে

A & B
Intersection (ছেদ)

A এবং B উভয়তে যা আছে

A - B
Difference (বিয়োগ)

A-তে আছে কিন্তু B-তে নেই

A ^ B
Symmetric Difference

A বা B-তে আছে কিন্তু উভয়তে নেই

Python — Set Operations
# দুটি Section-এর ছাত্র
section_a = {"রাহিম", "করিম", "সালমা", "জামাল"}
section_b = {"সালমা", "জামাল", "নাসরিন", "রফিক"}

# Union — সব ছাত্র
print("Union (সবাই):", section_a | section_b)

# Intersection — দুই Section-এই আছে
print("Intersection (দুজায়গায়):", section_a & section_b)

# Difference — শুধু A-তে আছে
print("শুধু A-তে:", section_a - section_b)
print("শুধু B-তে:", section_b - section_a)

# Symmetric Difference — একটিতে আছে কিন্তু দুটিতে নেই
print("Sym. Difference:", section_a ^ section_b)

# Method পদ্ধতিতেও করা যায়
print("\nMethod পদ্ধতি:")
print("Union:      ", section_a.union(section_b))
print("Intersection:", section_a.intersection(section_b))
✔ আউটপুট
Union (সবাই): {'রাহিম', 'করিম', 'সালমা', 'জামাল', 'নাসরিন', 'রফিক'}
Intersection (দুজায়গায়): {'সালমা', 'জামাল'}
শুধু A-তে: {'রাহিম', 'করিম'}
শুধু B-তে: {'নাসরিন', 'রফিক'}
Sym. Difference: {'রাহিম', 'করিম', 'নাসরিন', 'রফিক'}

Method পদ্ধতি:
Union:       {'রাহিম', 'করিম', 'সালমা', 'জামাল', 'নাসরিন', 'রফিক'}
Intersection: {'সালমা', 'জামাল'}
🔧 Set Methods ও frozenset
Python — Set Methods
nums = {1, 2, 3, 4, 5}

# add() — একটি যোগ
nums.add(6)
print(f"add পরে: {nums}")

# update() — একাধিক যোগ
nums.update([7, 8, 9])
print(f"update পরে: {nums}")

# remove() — না থাকলে KeyError
# discard() — না থাকলে কিছু হয় না (নিরাপদ)
nums.discard(100)   # Error আসবে না
nums.discard(9)

# Subset ও Superset যাচাই
a = {1, 2, 3}
b = {1, 2, 3, 4, 5}
print(f"a ⊂ b? {a.issubset(b)}")       # True — a, b-র অংশ
print(f"b ⊃ a? {b.issuperset(a)}")   # True — b, a-কে ধারণ করে
print(f"Disjoint? {a.isdisjoint({6,7})}") # True — মিল নেই

# frozenset — অপরিবর্তনীয় Set (Tuple-এর মতো)
frozen = frozenset([1, 2, 3])
print(f"frozenset: {frozen}")
# frozen.add(4)  ← AttributeError — পরিবর্তন করা যাবে না
✔ আউটপুট
add পরে: {1, 2, 3, 4, 5, 6}
update পরে: {1, 2, 3, 4, 5, 6, 7, 8, 9}
a ⊂ b? True
b ⊃ a? True
Disjoint? True
frozenset: frozenset({1, 2, 3})
⚖️ 4টি Data Structure তুলনা
বৈশিষ্ট্যList [ ]Tuple ( )Dict { k:v }Set { }
Ordered✅ হ্যাঁ✅ হ্যাঁ✅ (3.7+)❌ না
Mutable✅ হ্যাঁ❌ না✅ হ্যাঁ✅ হ্যাঁ
Indexing✅ হ্যাঁ✅ হ্যাঁKey দিয়ে❌ না
Duplicate✅ হ্যাঁ✅ হ্যাঁKey: না, Value: হ্যাঁ❌ না
কখন ব্যবহারপরিবর্তনযোগ্য সংগ্রহFixed ডেটাLabel করা ডেটাUnique মানের সেট

সহজ নিয়ম: ডেটা label করতে চাইলে → Dict। পরিবর্তন হবে → List। পরিবর্তন হবে না → Tuple। Duplicate বাদ দিতে বা গণিতের Set কাজ → Set

📱 প্র্যাকটিক্যাল প্রজেক্ট — Phone Book System

Dictionary ও Set একসাথে ব্যবহার করে একটি সম্পূর্ণ Phone Book তৈরি করি।

💻 প্রজেক্ট: Phone Book System

যোগাযোগ যোগ করো, নম্বর খোঁজো, আপডেট করো এবং গ্রুপ দেখাও — Dictionary ও Set দিয়ে।

Python — phone_book.py
# Phone Book — Dictionary ব্যবহার করে
phone_book = {}
favorites  = set()     # Favorites Set

def add_contact(naam, number, group="সাধারণ"):
    """নতুন যোগাযোগ যোগ করে।"""
    phone_book[naam] = {"number": number, "group": group}
    return f"✅ '{naam}' যোগ হয়েছে।"

def search_contact(naam):
    """যোগাযোগ খোঁজে।"""
    info = phone_book.get(naam)
    if info:
        fav = "⭐ " if naam in favorites else "   "
        return f"{fav}{naam}: {info['number']} [{info['group']}]"
    return f"❌ '{naam}' পাওয়া যায়নি।"

def add_favorite(naam):
    """Favorites-এ যোগ করে।"""
    if naam in phone_book:
        favorites.add(naam)
        return f"⭐ '{naam}' Favorites-এ যোগ হয়েছে।"
    return f"❌ '{naam}' Phone Book-এ নেই।"

def show_by_group(group):
    """গ্রুপ অনুযায়ী তালিকা দেখায়।"""
    contacts = {n: i for n, i in phone_book.items() if i["group"] == group}
    if not contacts:
        return f"'{group}' গ্রুপে কেউ নেই।"
    print(f"\n📁 গ্রুপ: {group}")
    for n, i in contacts.items():
        fav = "⭐" if n in favorites else "  "
        print(f"  {fav} {n:12} {i['number']}")

def show_stats():
    """Phone Book-এর পরিসংখ্যান।"""
    groups = {i["group"] for i in phone_book.values()}  # Set Comprehension
    print(f"\n📊 মোট যোগাযোগ: {len(phone_book)}")
    print(f"⭐ Favorites:    {len(favorites)}")
    print(f"📁 Groups:       {groups}")

# ── ব্যবহার ──
print(add_contact("রাহিম",  "01711-111111", "পরিবার"))
print(add_contact("করিম",   "01811-222222", "বন্ধু"))
print(add_contact("সালমা",  "01911-333333", "পরিবার"))
print(add_contact("নাসরিন", "01611-444444", "বন্ধু"))
print(add_contact("ডাক্তার", "01511-555555", "জরুরি"))

print(add_favorite("রাহিম"))
print(add_favorite("ডাক্তার"))

print()
print(search_contact("করিম"))
print(search_contact("রাহিম"))
print(search_contact("আরিফ"))

show_by_group("পরিবার")
show_stats()
✔ আউটপুট
✅ 'রাহিম' যোগ হয়েছে।
✅ 'করিম' যোগ হয়েছে।
✅ 'সালমা' যোগ হয়েছে।
✅ 'নাসরিন' যোগ হয়েছে।
✅ 'ডাক্তার' যোগ হয়েছে।
⭐ 'রাহিম' Favorites-এ যোগ হয়েছে।
⭐ 'ডাক্তার' Favorites-এ যোগ হয়েছে।

   করিম: 01811-222222 [বন্ধু]
⭐ রাহিম: 01711-111111 [পরিবার]
❌ 'আরিফ' পাওয়া যায়নি।

📁 গ্রুপ: পরিবার
  ⭐ রাহিম       01711-111111
     সালমা       01911-333333

📊 মোট যোগাযোগ: 5
⭐ Favorites:    2
📁 Groups:       {'পরিবার', 'বন্ধু', 'জরুরি'}
📚 এই পর্বে আমরা যা শিখলাম
  • Dictionary — Key-Value পেয়ারে ডেটা সংরক্ষণ
  • Dict তৈরি ও Access: dict[key] ও dict.get(key)
  • Dict Update, Delete (del, pop)
  • Methods: keys(), values(), items(), update(), setdefault()
  • Dictionary-তে Loop — items() সবচেয়ে ব্যবহৃত
  • Nested Dictionary — Dict-এর ভেতরে Dict
  • Dictionary Comprehension
  • Set — Unique মানের Unordered সংগ্রহ
  • List থেকে Duplicate সরানো: list(set(...))
  • Set Operations: Union |, Intersection &, Difference -, Sym. Diff ^
  • Set Methods: add, discard, update, issubset, issuperset
  • frozenset — অপরিবর্তনীয় Set
  • 4টি Data Structure তুলনা
  • Phone Book System প্রজেক্ট
🏋️ নিজে চেষ্টা করো
  1. Word Counter: একটি বাক্য থেকে প্রতিটি শব্দ কতবার আছে Dictionary দিয়ে গণনা করো
  2. Inventory: একটি দোকানের পণ্য তালিকা Dictionary দিয়ে বানাও — পণ্য যোগ, বাদ, আপডেট করো
  3. Common Friends: দুজনের বন্ধু তালিকা Set-এ রেখে common ও exclusive বন্ধু বের করো
  4. Duplicate Remover: Input হিসেবে যেকোনো List নাও, duplicate বাদ দিয়ে Sorted List ফেরত দাও
  5. Student Database: Nested Dictionary দিয়ে একটি ছোট ছাত্র ডেটাবেজ বানাও — নাম, ক্লাস, নম্বর রাখো, নির্দিষ্ট ছাত্র খোঁজো
⏭️ পরের পর্বে কী থাকছে? — পর্ব ৯: Strings গভীরে
  • String Formatting — f-string, format(), % সব পদ্ধতি
  • String Methods — split, join, strip, replace এবং আরও
  • String Slicing ও Indexing বিস্তারিত
  • Regular Expression-এর প্রাথমিক ধারণা
  • বাস্তব প্রজেক্ট — Text Analyzer

Post a Comment

0 Comments