- Dictionary কী? — বাস্তব উদাহরণে
- Dictionary তৈরি ও Access করা
- Dictionary Update ও Delete
- গুরুত্বপূর্ণ Dictionary Methods
- Dictionary-তে Loop
- Nested Dictionary
- Dictionary Comprehension
- Set কী এবং কীভাবে তৈরি করে?
- Set Operations — Union, Intersection, Difference
- Set Methods ও frozenset
- 4টি Data Structure তুলনা
- প্র্যাকটিক্যাল প্রজেক্ট — Phone Book System
- সারাংশ ও অনুশীলন
গত পর্বে আমরা List শিখেছি — Index দিয়ে ডেটা access করা। কিন্তু কিছু তথ্য নামে রাখলে বোঝা সহজ হয়। যেমন একজন মানুষের তথ্য রাখতে person[0] বলার চেয়ে person["naam"] বলা অনেক বেশি পরিষ্কার। এই সুবিধার জন্যই Python-এ আছে Dictionary।
Dictionary হলো একটি Data Structure যেখানে ডেটা Key-Value পেয়ার হিসেবে সংরক্ষণ করা হয়। এটি বাস্তব জীবনের অভিধানের মতো — শব্দ (Key) দিয়ে তার অর্থ (Value) খোঁজা যায়।
| বৈশিষ্ট্য | মানে |
|---|---|
| Key-Value পেয়ার | প্রতিটি উপাদান একটি নাম (Key) ও মান (Value) দিয়ে গঠিত |
| Ordered (3.7+) | Python 3.7 থেকে যে ক্রমে যোগ করা হয় সে ক্রমে থাকে |
| Mutable | যোগ, বাদ, পরিবর্তন করা যায় |
| Key Unique | একই Key দুইবার থাকতে পারে না — দ্বিতীয়টি প্রথমটি overwrite করে |
| Value যেকোনো | Value হতে পারে সংখ্যা, লেখা, List, এমনকি আরেকটি Dictionary |
Dictionary তৈরি করতে Curly Braces { } ব্যবহার করো। Key ও Value-এর মাঝে কোলন (:) দাও।
# 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") ব্যবহার করা নিরাপদ।
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': 'ডেভেলপার'}
সব Key-এর তালিকা দেয়
সব Value-এর তালিকা দেয়
সব (Key, Value) tuple দেয়
Key-এর Value নিরাপদে নেয়
অন্য Dict মার্জ করে
Key মুছে Value ফেরত দেয়
শেষ item মুছে ফেরত দেয়
Key না থাকলে default সেট করে
Dict-এর একটি কপি তৈরি করে
Dict সম্পূর্ণ খালি করে
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 চালানোর তিনটি পদ্ধতি আছে।
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)
Dictionary-র Value হিসেবে আরেকটি 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
List Comprehension-এর মতো Dictionary-ও এক লাইনে তৈরি করা যায়।
# ১ থেকে ৫-এর বর্গ 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 হলো অনন্য (unique) মানের একটি অসংগঠিত সংগ্রহ। Set-এ একই মান দুইবার রাখা যায় না — duplicate স্বয়ংক্রিয়ভাবে বাদ পড়ে।
| বৈশিষ্ট্য | মানে |
|---|---|
| Unique | প্রতিটি মান একবারই থাকতে পারে |
| Unordered | কোনো নির্দিষ্ট ক্রম নেই |
| Mutable | যোগ ও বাদ করা যায় |
| No Indexing | Index দিয়ে Access করা যায় না |
| Hashable | List রাখা যায় না, Tuple রাখা যায় |
# 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-এর সবচেয়ে শক্তিশালী দিক হলো গণিতের Set Theory-র Operations। এগুলো দিয়ে দুটি গ্রুপের মধ্যে মিল ও পার্থক্য খুঁজে বের করা যায়।
A এবং B উভয়ের সব উপাদান একসাথে
A এবং B উভয়তে যা আছে
A-তে আছে কিন্তু B-তে নেই
A বা B-তে আছে কিন্তু উভয়তে নেই
# দুটি 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: {'সালমা', 'জামাল'}
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})
| বৈশিষ্ট্য | 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।
Dictionary ও Set একসাথে ব্যবহার করে একটি সম্পূর্ণ Phone Book তৈরি করি।
যোগাযোগ যোগ করো, নম্বর খোঁজো, আপডেট করো এবং গ্রুপ দেখাও — Dictionary ও Set দিয়ে।
# 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 প্রজেক্ট
- Word Counter: একটি বাক্য থেকে প্রতিটি শব্দ কতবার আছে Dictionary দিয়ে গণনা করো
- Inventory: একটি দোকানের পণ্য তালিকা Dictionary দিয়ে বানাও — পণ্য যোগ, বাদ, আপডেট করো
- Common Friends: দুজনের বন্ধু তালিকা Set-এ রেখে common ও exclusive বন্ধু বের করো
- Duplicate Remover: Input হিসেবে যেকোনো List নাও, duplicate বাদ দিয়ে Sorted List ফেরত দাও
- Student Database: Nested Dictionary দিয়ে একটি ছোট ছাত্র ডেটাবেজ বানাও — নাম, ক্লাস, নম্বর রাখো, নির্দিষ্ট ছাত্র খোঁজো
- String Formatting — f-string, format(), % সব পদ্ধতি
- String Methods — split, join, strip, replace এবং আরও
- String Slicing ও Indexing বিস্তারিত
- Regular Expression-এর প্রাথমিক ধারণা
- বাস্তব প্রজেক্ট — Text Analyzer

0 Comments