Excellent choice.
DICTIONARY MASTERY (Module 3) is pure interview gold — hashing, frequency maps, order guarantees, and patterns like LRU caches decide outcomes in senior interviews.
We’ll do this in 3 tight days:
- Day 1 → Internals + methods + traps
- Day 2 → Core interview patterns (frequency, grouping, prefix-hash)
- Day 3 → Advanced patterns (LRU, design questions, 30+ drills)
🔥 MODULE 3 — DICTIONARY MASTERY
Day 1: Internals, Core Methods & Dangerous Traps



🧠 MODULE GOAL (DICTS)
By the end of this module, you will:
- Understand how dicts work internally
- Know every important dict method
- Avoid hashing & mutability traps
- Instantly recognize dict interview patterns
- Explain performance confidently
1️⃣ WHAT A PYTHON DICT REALLY IS (CRITICAL)
A Python dict is:
- A hash table
- Uses open addressing
- Stores key → value references
- Preserves insertion order (guaranteed ≥ Python 3.7)
Internally (simplified):
PyDictObject
├── indices (hash table)
└── entries (key, value, hash)
🧠 Keys are hashed once, hash is cached (if immutable)
2️⃣ WHY DICT LOOKUPS ARE FAST
Average-case:
- Lookup: O(1)
- Insert: O(1)
- Delete: O(1)
Worst-case:
- O(n) (hash collisions)
- Rare due to randomized hashing
Interview line:
“Python dicts are hash tables with amortized O(1) operations.”
3️⃣ HASHABILITY — NON-NEGOTIABLE RULE
Dict keys MUST be:
✔ Hashable
✔ Immutable
Valid keys:
"abc", 10, (1,2), frozenset({1,2})
Invalid keys:
[], {}, set()
🔥 Interview trap:
d = {}
d[(1, [2])] = "x" # ❌ TypeError
4️⃣ DICT METHODS — COMPLETE & GROUPED
🔍 A. ACCESS METHODS
d[key]
value = d["a"]
- Fast
- Raises
KeyErrorif missing
🔥 get(key, default=None)
d.get("a", 0)
Why important:
- No exception
- Cleaner code
- Interview-friendly
🔥 setdefault(key, default)
d.setdefault("a", []).append(1)
Equivalent to:
if "a" not in d:
d["a"] = []
d["a"].append(1)
⚠️ Trap:
- Default created even if key exists
- Can waste memory
🔄 B. MUTATION METHODS
update()
d.update({"a":1, "b":2})
Rules:
- Overwrites existing keys
- Accepts iterable of pairs
pop(key[, default])
d.pop("a")
- Removes and returns value
- Raises KeyError unless default provided
popitem()
d.popitem()
Important:
- Removes last inserted item
- O(1)
- Used in LRU cache logic
clear()
d.clear()
👀 C. VIEW METHODS (NOT COPIES)
d.keys()
d.values()
d.items()
Facts:
- Return views, not lists
- Reflect live changes
- Lightweight
Trap:
for k in d.keys():
d.pop(k) # ❌ RuntimeError
5️⃣ INSERTION ORDER — WHAT IS GUARANTEED
d = {"a":1, "b":2, "c":3}
Since Python 3.7:
- Order is language guarantee
- Not implementation accident
But:
- Updating value does NOT move key
pop()+ reinsert moves to end
Interviewers love order questions.
6️⃣ DICT COPYING — SHALLOW TRAPS 🚨
Shallow copy
d2 = d.copy()
Trap:
d = {"a":[1,2]}
d2 = d.copy()
d2["a"].append(3)
print(d) # {'a':[1,2,3]}
Why:
- Values are references
Deep copy:
import copy
copy.deepcopy(d)
7️⃣ MUTABLE DEFAULT ARGUMENT + DICTS (CLASSIC BUG)
def f(d={}):
d["x"] = 1
return d
Same issue as lists:
- Dict created once
- Shared across calls
Always:
def f(d=None):
if d is None:
d = {}
🔥 DICT INTERVIEW QUESTIONS (DAY 1 SET)
Q1. Why lists can’t be dict keys?
(Expected: mutability + hash instability)
Q2. get() vs [] — when to use which?
Q3. Why setdefault() is dangerous in hot loops?
Q4. Difference between pop() and popitem()?
Q5. Why dict preserves insertion order?
🧠 DICT MENTAL CHECKLIST
Before writing dict code:
- Key hashable?
- Need safe access?
- Order matters?
- Mutability inside values?
- Shallow vs deep copy?
📝 MODULE 3 — DAY 1 ASSIGNMENT
1️⃣ Predict output (NO RUNNING)
d = {"a":[1]}
d2 = d.copy()
d2["a"].append(2)
print(d)
2️⃣ Choose correct method (Explain WHY)
Count frequencies of items efficiently.
3️⃣ Coding
def invert_dict(d):
"""
Values are unique
"""
🔜 NEXT — DICTIONARY MASTERY DAY 2 🔥
DAY 2
- Frequency map pattern (most used)
- Grouping (anagrams, buckets)
- Prefix-hash tricks
- 20+ dict interview problems
👉 Say “CONTINUE DICTIONARY MASTERY – DAY 2” when ready.