1.2.24 · Coding › Introduction to Programming (Python)
Ek dictionary ek real-world dictionary ki tarah hoti hai: tum ek word (the key ) dhundhte ho aur seedha uski meaning (the value ) mil jaati hai. Tum har page scan nahi karte — tum directly us word pe jump karte ho. Python dictionaries unordered (insertion-ordered since 3.7) collections hoti hain jo keys ko values se map karti hain, aur ye fast lookup by key ke liye optimized hoti hain, position se nahi.
Ek dictionary ek mutable collection of key-value pairs hoti hai. Har key unique aur hashable honi chahiye (immutable types jaise str, int, tuple). Har key exactly ek value (kisi bhi type ki) se map hoti hai. Curly braces ke saath likhi jaati hai: {key: value, ...}.
student = { "name" : "Asha" , "age" : 20 , "marks" : [ 88 , 91 ]}
Keys hashable kyun honi chahiye? Python keys ko ek hash table mein store karta hai. Wo key ko ek hash() function se run karta hai taaki kahan value store karni hai ye compute ho sake. Agar key change ho sakti (jaise ek list), toh uska hash bhi change ho jaata, aur Python value "kho" deta. Isliye mutable types keys ke roop mein forbidden hain.
Intuition WHY dictionaries are fast (the 80/20 core)
List mein "Asha" ke liye marks dhundho jaisa lookup matlab hai har item ko ek-ek karke check karna → O ( n ) . Ek dictionary hash("Asha") compute karta hai → ek address → seedha value padhta hai → average O ( 1 ) , size se independent. Yahi constant-time lookup ek reason hai jiske liye dictionaries exist karti hain.
Action
Syntax
If key missing
Bracket access
d["name"]
❌ raises KeyError
Safe access
d.get("name")
returns None
Safe with default
d.get("name", "?")
returns "?"
Worked example Access in action
d = { "name" : "Asha" , "age" : 20 }
print (d[ "name" ]) # Asha
print (d.get( "city" )) # None (no crash!)
print (d.get( "city" , "NA" )) # NA
# print(d["city"]) # KeyError — would crash
.get() kyun use karein? Jab tumhe lagta hai ki key absent ho sakti hai, .get() program ko crash ki jagah continue karne deta hai. Yahi 80% real-world use hai.
d = { "name" : "Asha" }
d[ "age" ] = 20 # add new pair
d[ "age" ] = 21 # overwrite existing key
d.update({ "city" : "Pune" , "age" : 22 }) # add/overwrite many
del d[ "name" ] # remove a pair
val = d.pop( "city" ) # remove + return its value
Ye step kyun? d["age"] = 20 aur d["age"] = 21 syntactically ek jaise lagte hain, lekin pehla create karta hai , doosra overwrite karta hai — kyunki har key unique hoti hai, existing key ko assign karna replace karta hai, kabhi duplicate nahi.
Intuition "View" kya hota hai?
keys(), values(), items() dynamic views return karte hain — dict ke upar ek window. Agar dict change hoti hai, view automatically reflect karta hai. Ye copies nahi hain, isliye ye saste hain.
Worked example Iterating — the everyday pattern
scores = { "math" : 90 , "sci" : 85 , "eng" : 78 }
for k in scores: # default loops over KEYS
print (k) # math, sci, eng
for k, v in scores.items(): # unpack key AND value
print (k, "->" , v) # math -> 90, ...
total = sum (scores.values()) # 253
.items() kyun? Ye tumhe dono cheezein ek saath deta hai, isliye tum loop ke andar slow pattern scores[k] se bachte ho.
Worked example Reinventing the lookup
Socho koi dictionaries exist nahi karti thi. Tum pairs ko do parallel lists mein store karte:
keys = [ "a" , "b" , "c" ]
values = [ 1 , 2 , 3 ]
def lookup (k):
for i in range ( len (keys)): # O(n) scan
if keys[i] == k:
return values[i]
Ek dict is poore scan ko ek hash computation se replace kar deti hai. Isliye dict syntax d[k] exist karta hai: ye parallel-list pattern ko automatic aur fast bana deta hai.
d["x"] .get() ki tarah safe hai"
Kyun sahi lagta hai: dono value read karte hain, isliye dono interchangeable lagte hain.
Sach: d["x"] crash karta hai KeyError ke saath agar x absent ho; .get("x") None return karta hai. Fix: .get() use karo (ya if "x" in d) jab key exist na kare.
Common mistake "Main list ko key ki tarah use kar sakta hoon"
Kyun sahi lagta hai: lists data hold karti hain aur valid identifiers ki tarah lagti hain.
Sach: lists mutable / unhashable hoti hain → TypeError: unhashable type: 'list'. Fix: key ki jagah tuple (1,2) use karo — tuples immutable hote hain, isliye hashable hote hain.
Common mistake "Duplicate keys dono values rakhti hain"
Kyun sahi lagta hai: lists duplicate elements allow karti hain, isliye dicts bhi waise lagte hain.
Sach: {"a":1, "a":2} → {"a":2}. Baad wali value silently overwrite ho jaati hai. Fix: keys by design unique hoti hain; distinct keys chuno.
for x in d values pe loop karta hai"
Kyun sahi lagta hai: kai languages mein iteration stored data deta hai.
Sach: dict ko iterate karne se keys milti hain, values nahi. Fix: values ke liye d.values() ya d.items() use karo.
Recall Feynman: ek 12-saal ke bacche ko explain karo
Dictionary ek magic backpack hai jisme labeled pockets hain. Tum poora bag nahi khodते — tum ek label bol dete ho ("snacks") aur sahi pocket seedha khul jaati hai. Har label special hota hai (sirf ek "snacks" pocket hoti hai), aur tum andar koi bhi toy rakh sakte ho. .get() poochhne ka polite tarika hai — agar koi "homework" pocket nahi hai, toh bag sirf kehta hai "yahan kuch nahi" bajaye chillane ke.
Mnemonic Methods yaad karo
"Keys Values Items Get Update" → "Kids Visit Igloos, Get Umbrellas"
Aur access ke danger ke liye: bracket = Bang (crash), get = Gentle.
Dictionary keys ka type kya hona chahiye? Unique aur hashable (immutable: str, int, tuple)
Dict lookup list lookup se faster kyun hai? Dict ek hash table use karta hai → average O(1); list element-by-element scan karti hai → O(n)
d["x"] aur d.get("x") mein kya fark hai?d["x"] missing hone par KeyError raise karta hai; d.get("x") None (ya diya gaya default) return karta hai
d.items() kya return karta hai?(key, value) tuples ka ek view
{"a":1, "a":2} ke saath kya hota hai?Baad wali value jeetti hai → {"a": 2} (keys unique hoti hain)
for x in d iterate karne par kya milta hai?Keys (values nahi)
Dict b ko dict a mein merge kaise karte ho? a.update(b) (in place; shared keys overwrite ho jaati hain)
List dictionary key kyun nahi ban sakti? Lists mutable/unhashable hoti hain; unka hash change ho sakta hai. Tuple use karo.
Key remove karke uski value wapas kaise paate ho? d.pop("key")
Kya keys()/values()/items() copies hain? Nahi — ye dynamic views hain jo dict mein changes reflect karti hain.
Lists — ordered mutable sequences
Tuples — immutable sequences (valid dict keys)
Sets — unique hashable elements (same hash-table machinery)
Hashing and Hash Tables
For loops and iteration
Big-O Notation — time complexity