Exercises — Dictionary and set comprehensions
1.2.35 · D4· Coding › Introduction to Programming (Python) › Dictionary and set comprehensions
Shuru karne se pehle, yeh ek mental picture hai jo hum baar baar reuse karte hain — ek comprehension ki anatomy. Har coloured zone ek kaam hai: kya store karte ho, source kahan se aata hai, aur kya keep karte ho.

Level 1 — Recognition
Goal: ek comprehension padho aur uska exact output predict karo. Abhi likhna nahi — bas dekhna hai.
L1.1
Har ek ka type aur value kya hai?
A = {}
B = {1, 2, 3}
C = {"a": 1}
D = {x for x in range(3)}Recall Solution
A→ emptydict(akele braces = dict, classic trap).type(A)haidict.B→ ekset{1, 2, 3}(values hain, colon nahi).C→ ekdict{"a": 1}(colon present hai ⇒ key:value).D→ ek set comprehension jo{0, 1, 2}produce karta hai.
Yahan use hua rule: braces mein kahin bhi colon ⇒ dict; warna set; empty braces ⇒ dict.
L1.2
Output predict karo:
{n: n + 10 for n in range(3)}Recall Solution
DRIVE deta hai n = 0, 1, 2. HEAD store karta hai n: n+10.
Result: {0: 10, 1: 11, 2: 12}.
L1.3
Output predict karo:
{len(s) for s in ["hi", "yo", "sun"]}Recall Solution
Lengths hain 2, 2, 3. Colon nahi ⇒ set, aur set duplicates drop karta hai.
Dono 2 ek mein collapse ho jaate hain. Result: {2, 3}.
Level 2 — Application
Goal: ek stated task ke liye scratch se comprehension likho.
L2.1
Har number 1..5 ko uske cube se map karta hua ek dict banao.
Recall Solution
{n: n**3 for n in range(1, 6)}
# {1: 1, 2: 8, 3: 27, 4: 64, 5: 125}HEAD n: n**3, DRIVE for n in range(1, 6). range(1, 6) 6 se pehle rok leta hai, toh yeh 1..5 hai.
L2.2
nums = [4, 7, 10, 13] se, sirf 2 se divisible numbers ka ek set banao.
Recall Solution
nums = [4, 7, 10, 13]
{x for x in nums if x % 2 == 0}
# {10, 4}GATE if x % 2 == 0 element keep hone se pehle run hota hai. Sirf 4 aur 10 pass karte hain.
(x % 2 2 se divide karne ke baad remainder hai; == 0 ka matlab hai "evenly divisible".)
L2.3
["cat", "dog", "ox"] mein har word ko uski length se map karta hua dict banao.
Recall Solution
words = ["cat", "dog", "ox"]
{w: len(w) for w in words}
# {'cat': 3, 'dog': 3, 'ox': 2}Note: values freely repeat ho sakte hain (yahan do 3 hain). Sirf keys unique hone chahiye — aur words
already hain.
Level 3 — Analysis
Goal: collisions, ordering, aur kya silently disappear ho jaata hai, iske baare mein reason karo.
L3.1
Is dict mein kitni entries hain, aur kaun si survive karti hain?
{x % 3: x for x in range(7)}Recall Solution
x run karta hai 0..6. Key hai x % 3, toh keys cycle karti hain 0,1,2,0,1,2,0. Same key ⇒ baad ki value
overwrite karti hai pehli ko. Har key ka last writer track karo:
- key
0:x=0,3,6ne likha → last hai 6 - key
1:x=1,4ne likha → last hai 4 - key
2:x=2,5ne likha → last hai 5
Result: {0: 6, 1: 4, 2: 5} — 3 entries, 7 nahi.
L3.2
Is set ki size kya hai?
{abs(x) for x in [-2, -1, 0, 1, 2]}Recall Solution
abs deta hai 2, 1, 0, 1, 2. Distinct values: {0, 1, 2} → size 3.
-1,1 dono 1 mein collapse ho jaate hain aur -2,2 dono 2 mein. Yeh halving ek set ka poora point hai: yeh
guarantee karta hai koi duplicates nahi.
L3.3
d = {"a": 1, "b": 2, "c": 1} ko {v: k for k, v in d.items()} se invert karo. Kitni entries result mein aati hain?
Recall Solution
.items() yield karta hai ("a",1), ("b",2), ("c",1). Naye keys hain purane values 1, 2, 1.
Key 1 do baar appear hoti hai ("a" se phir "c" se); baad wala jeetta hai → "c".
Result: {1: "c", 2: "b"} → 2 entries (ek grade collide kar gaya).
Level 4 — Synthesis
Goal: comprehensions ko ternaries, nesting, aur doosre iterables ke saath combine karo.
L4.1
Har n ko 0..5 mein string "even" ya "odd" se map karo.
Recall Solution
{n: ("even" if n % 2 == 0 else "odd") for n in range(6)}
# {0:'even',1:'odd',2:'even',3:'odd',4:'even',5:'odd'}Ternary conditional expression A if cond else B value slot (head) mein rehta hai. Yeh
choose karta hai, toh har n ko phir bhi ek entry milti hai — kuch filter nahi hota.
L4.2
Do lists names = ["Asha", "Ravi"] aur scores = [90, 75] se, pairing dict banao.
Recall Solution
names = ["Asha", "Ravi"]
scores = [90, 75]
{name: score for name, score in zip(names, scores)}
# {'Asha': 90, 'Ravi': 75}zip dono lists ko lockstep mein walk karta hai, pehle ("Asha", 90) phir ("Ravi", 75) deta hai. Hum har
pair ko name, score mein unpack karte hain.
L4.3
["bee", "add", "cab"] mein appear hone wale saare distinct letters ka set banao.
Recall Solution
words = ["bee", "add", "cab"]
{ch for w in words for ch in w}
# {'b', 'e', 'a', 'd', 'c'}Nested drive: dono fors ko left to right, outer to inner padho — "har word w ke liye, us word mein
har character ch ke liye." Letters b,e,e,a,d,d,c,a,b collapse hokar 5 distinct
{a, b, c, d, e} ban jaate hain.
Level 5 — Mastery
Goal: ek chhota tool design karo, dict vs set choose karo aur collisions deliberately handle karo.
L5.1
data = [3, 1, 4, 1, 5, 9, 2, 6, 5] diya hai, ek dict banao jo har distinct value ko
uske appear hone ki count se map kare. (Hint: pehle distinct set banao, phir count karo.)
Recall Solution
data = [3, 1, 4, 1, 5, 9, 2, 6, 5]
{v: data.count(v) for v in set(data)}
# {1: 2, 2: 1, 3: 1, 4: 1, 5: 2, 6: 1, 9: 1}DRIVE mein set(data) kyun? Yeh har value ko ek baar deta hai, toh koi wasted recomputation nahi aur koi
collisions nahi. data.count(v) list scan karke v count karta hai. 1 aur 5 do baar appear hote hain; baaki sab
ek baar. Total distinct keys = 7.
L5.2
pairs = [("a", 1), ("b", 2), ("a", 3)] se ek dict banao jahan har key apni SAARI values ek
list mein rakhe (toh "a" par collision preserve ho, overwrite na ho).
Recall Solution
Ek single comprehension "a": 3 ko "a": 1 overwrite karne dega. Saare rakhne ke liye, value ke andar
distinct keys ko drive ke roop mein use karke group karo:
pairs = [("a", 1), ("b", 2), ("a", 3)]
keys = {k for k, _ in pairs} # {'a', 'b'}
{k: [v for kk, v in pairs if kk == k] for k in keys}
# {'a': [1, 3], 'b': [2]}Outer dict comprehension distinct keys par drive karta hai; inner list comprehension
har woh v gather karta hai jiska original key match kiya. "a" ab safely [1, 3] rakhta hai.
L5.3
Har n ke liye 1..10 mein ek dict banao jo "fizz" map kare agar 3 se divisible ho, "buzz" agar 5 se divisible ho,
"fizzbuzz" agar dono se, warna n khud.
Recall Solution
{n: ("fizzbuzz" if n % 15 == 0
else "fizz" if n % 3 == 0
else "buzz" if n % 5 == 0
else n)
for n in range(1, 11)}
# {1:1, 2:2, 3:'fizz', 4:4, 5:'buzz', 6:'fizz',
# 7:7, 8:8, 9:'fizz', 10:'buzz'}Order matter karta hai: n % 15 (dono) pehle test karo, warna ek fizzbuzz number
n % 3 branch mein catch ho jaayega aur galat label mil jaayega. Yeh ek chained ternary hai jo poori tarah value slot
mein rehta hai — phir bhi koi filtering nahi, har n ko ek entry milti hai.
Connections
- Dictionary and set comprehensions — parent topic jisko yeh exercises drill karte hain
- List comprehensions — inner
[v for ...]jo L5.2 mein use hua - Ternary conditional expression — L4.1 aur L5.3 mein value-chooser
- Dictionaries in Python · Sets in Python — woh structures jo build ho rahe hain
- Hashing and hashable types — kyun keys unique aur hashable honi chahiye
- Generator expressions — lazy cousin jo
(...)use karta hai