1.2.34 · D1 · Coding › Introduction to Programming (Python) › [[1.2.34 List comprehensions — `[expr for x in iterable if condition]`|List comprehensions — `[expr for x in iterable if condition]]]
Ek list comprehension ek conveyor belt pe factory jaisi hai: items ek source se aate hain, ek optional guard kuch ko bahar phenk deta hai, aur ek machine har bachne wale ko reshape karti hai — aur end mein tumhare paas ek brand-new list hoti hai. Is page ke end tak tum ek line ka recipe [expr for x in iterable if condition] ko plain English ki tarah padh paoge — lekin un mein se har ek word (expr, iterable, condition) neeche pehle define kiya gaya hai, before hum usse lean karte hain.
Before tum us one-liner ko padh sako, tumhe un chhote pieces mein fluent hona chahiye jinse woh bana hai. Is page mein yeh assume kiya gaya hai ki tum kuch nahi jaante, aur har symbol earn kiya jaata hai, ek ek karke, us order mein jisme woh ek doosre pe depend karte hain. Hum full recipe sirf final section mein assemble karenge, jab har part ka ek meaning ho jaayega.
Definition Value aur literal
Ek value data ka ek single piece hai jiske saath tumhara program kaam kar sakta hai — jaise 5 ek number, ya "apple" jaise quotes mein likha hua ek string (text). Jab tum data ko apne code mein directly likhte ho (5, "apple", True), us likhe hue form ko literal kehte hain — woh literally woh value hai, koi computation nahi chahiye.
Picture: ek value ek physical object hai — ek coin (5), ek likha hua word ("apple") — jise tum hold kar sakte ho, pass around kar sakte ho, ya ek box mein daal sakte ho.
Definition Assignment operator
=
Ek single = ek name ko ek value pe stick karta hai . x = 5 padha jaata hai "let the name x refer to the value 5". Yeh ek command hai ("make it so"), koi question nahi. Yeh == (do equals) se alag hai, jo tumhein §5 mein milega aur jo ek sawaal poochta hai.
Intuition Is topic ko yeh kyun chahiye
Har ek item jo ek comprehension se guzarta hai woh ek value hai , aur built list values ka ek box hai. Hum = bhi is page mein use karte hain (jaise r = [] ek empty box banane ke liye) — isliye dono ko define karna zaroori hai before hum unhe use karein. Neeche ki har code line yeh jaanne pe tiki hai ki value kya hai aur = kya karta hai.
Ek list values ka ek ordered box hai, jise values ko square brackets ke andar rakhke likha jaata hai: [10, 20, 30]. "Ordered" ka matlab hai ki har value ki ek fixed position hoti hai (ek pehli, ek doosri, ek teesri), isliye [1, 2] ek alag list hai [2, 1] se.
,
Comma pure syntax hai jo ek item ko doosre se alag karti hai — yeh kisi bhi item ki value ka hissa nahi hai. [10, 20, 30] mein teen items hain (10, 20, 30); commas sirf unke beech ki fences hain. Commas ke bina Python nahi bata sakta ki ek item kahan khatam hoti hai aur doosri kahan shuru hoti hai.
Picture: numbered lockers ki ek row imagine karo, har pair ke beech ek patla divider (comma). Locker 0 mein pehla item, locker 1 mein doosra, aur aage bhi isi tarah (Python zero se count karna shuru karta hai, ek se nahi — yeh yaad rakho).
Figure s01 — ek list ko numbered lockers ki row ki tarah draw kiya gaya hai. Har locker ek item rakhta hai; patle dividers commas hain; har locker ke neeche index label 0 se count karta hai.
Intuition Is topic ko yeh kyun chahiye
Ek list comprehension ek nayi list banata hai. Recipe mein outer [ ] wahi same square brackets hain — woh us box ki deewarein hain jo fill ho rahi hain — aur bani list ke items ko usi comma se alag kiya jaata hai. Agar tumhe pata nahi hota ki [ ] aur , ka matlab kya hai, toh notation character one se hi ek mystery hoti.
Ek variable ek naam hai jo ek value ki taraf point karta hai . x = 5 likhna (§0a se = use karke) matlab hai "stick the label x onto the value 5". Baad mein, jab bhi tum x likhte ho, Python dekhta hai ki label kisse attached hai aur woh use karta hai.
Picture: ek luggage tag. Tag kehta hai x; ise ek suitcase (value) se doosri pe move kiya ja sakta hai. Loop ke dauran, tag x har item pe re-stick hota jaata hai.
Intuition Is topic ko yeh kyun chahiye
Recipe mein letter x bilkul yahi luggage tag hai. Har pass pe woh next item se re-attach ho jaata hai, taaki output part "current item" ke baare mein sirf x bolke baat kar sake. Ek re-stickable naam ki idea ke bina, for x part meaningless hai.
Common mistake Steel-man: "
x ek fixed cheez hai, jaise ek constant."
Yeh fixed lagta hai kyunki yeh ek letter hai. Reality: loop ke andar x har pass pe change hota hai — woh current item hai, koi frozen value nahi. Fix: for x in ... ko aise padho "let x become each item, one at a time".
Common mistake Steel-man: "Ek comprehension ke baad,
x abhi bhi last item rakhta hai, jaise ek plain for loop ke baad hota hai."
Ek plain for x in ...: loop ke baad, x leak karta hai aur apni last value rakhta hai. Lekin ek list comprehension mein (Python 3), loop variable x comprehension ke apne private scope mein isolated hai — yeh surrounding code mein nahi aata. Reality:
x = 99
squares = [x ** 2 for x in range ( 3 )] # x here is private
print (x) # still 99, NOT 2
Fix: comprehension ke x ko ek aisa naam samjho jo brackets ke andar jeeta aur marta hai; Python 3 mein yeh bahar ke same naam wale x ko kabhi overwrite nahi karta.
Ek iterable kuch bhi hai jisse tum items ek ek karke, order mein nikaal sako . Ek list [1,2,3] iterable hai (1 nikalo, phir 2, phir 3). Ek string "abc" iterable hai ('a', 'b', 'c' nikalo).
Picture: ek Pez dispenser ya conveyor belt — tum sab kuch ek saath nahi lete, tum next item lete ho, phir next.
range(n)
range(n) ek special iterable hai jo whole numbers ==0 se shuru karke n se pehle rok deta hai==. Toh range(4) deta hai 0, 1, 2, 3 (chaar numbers, lekin 4 nahi ).
Figure s02 — range(4) ek dispenser ke roop mein jo 0, 1, 2, 3 order mein hand out karta hai; greyed-out 4 dikhata hai ki stop value kabhi produce nahi hoti.
Common mistake Steel-man: "
range(4) mein 4 shamil hai."
4 tak count karna natural lagta hai. Reality: range(n) ek short ruk jaata hai — yeh 0,1,2,3 deta hai. Items ki count n ke barabar hoti hai, lekin last value n-1 hoti hai. Fix: ise zor se bolo "up to but not including n".
Definition Generator (plain words mein)
Ek generator ek one-shot iterable hai jo apne items lazily produce karta hai — yeh har item tabhi banata hai jab tum maango, aur ek baar jab tum isse walk through kar lo, yeh used up ho jaata hai (tum ise dobaara loop nahi kar sakte ya iski length nahi poochh sakte). Ek list se contrast karo, jo har item upfront store karti hai aur reuse ho sakti hai.
Intuition Is topic ko yeh kyun chahiye
for x in iterable slot ko items ka ek source chahiye. Parent ke example mein range(10) woh source hai. Note karo ki range ek generator nahi hai — yeh ek reusable sequence object return karta hai (tum same range ko do baar loop kar sakte ho, iski length poochh sakte ho, ya ise index kar sakte ho), bas yeh saare numbers ek saath store nahi karta. Woh distinction exactly woh bridge hai Generator expressions tak, jo baad mein aate hain, jo sach mein one-shot aur lazy hain is defined sense mein.
range() and iterables dekho for slot ko feed karne wali cheez ki full story ke liye.
for loop
Ek for loop ek iterable ke har item ke liye code ka ek block ek baar repeat karta hai . Syntax hai:
for x in iterable:
body # runs once per item, with x set to that item
: aur indentation
for line ke end mein colon : announce karta hai "code ka ek block follow karta hai" — yeh required punctuation hai jo loop ka body open karta hai. Us body se belong karne wali lines phir indentation (leading spaces ki consistent count) se mark hoti hain. Python mein kuch languages ki tarah { } braces nahi hote; instead, colon kehta hai "yahan ek block aa raha hai" aur indentation kehti hai "ye indented lines wahi block hain" . Un-indent karo, aur tum loop se bahar aa gaye.
Picture: colon ek doorway sign hai jisme likha hai "loop body this way ↓", aur indentation woh walled-off room hai jis taraf sign point karta hai. Ek factory worker belt se har item ek ek karke uthata hai, us pe indented kaam karta hai, aur agla item uthata hai.
Figure s03 — for loop ek conveyor belt ke roop mein: items 0, 1, 2 ek ek karke aate hain, loop variable x baarimaar inme se har ek ban jaata hai, aur body har item ke liye ek baar run karti hai.
Intuition Is topic ko yeh kyun chahiye
Ek list comprehension ek for loop hai jo disguise pehne hue hai. Parent ki poori "derivation from the loop" tabhi samajh mein aati hai jab tum ek for loop ko haath se trace kar sako: item lo, body chalao, repeat karo. Baki sab uske upar sugar hai. (Comprehension colon aur indentation drop kar deta hai, kyunki woh poori cheez ek line pe squeeze kar deta hai.) For loops dekho.
Worked example Ek baar haath se trace karo
for x in range ( 3 ):
print (x)
Pass 1: x becomes 0, print 0. Pass 2: x becomes 1, print 1. Pass 3: x becomes 2, print 2. Phir range(3) empty hai, toh loop ruk jaata hai. Output: 0 1 2.
.append(item)
.append ek existing list ke end mein ek item add karta hai . Ek empty list r = [] se shuru karke (§0a se = use karke), r.append(7) call karne se r ban jaata hai [7]; doosri baar r.append(9) se woh ban jaata hai [7, 9].
Picture: box ke peechhe ek aur apple daalte jaana har baar.
Intuition Is topic ko yeh kyun chahiye
Parent ka "honest loop" r = [] (empty box) se shuru hota hai aur har pass pe r.append(expr) call karta hai. List comprehension dono ko hide karta hai — empty box ko bhi aur append ko bhi — lekin woh abhi bhi ho rahe hain. Yeh jaanna ki woh exist karte hain tumhe kisi bhi comprehension ko wapas loop mein likhne deta hai jab woh confusing ho jaaye (parent ka recommended debugging trick).
Ek Boolean ek value hai jo ==True ya False== mein se ek hoti hai — kuch aur nahi. Ek condition koi bhi expression hai jo ek Boolean evaluate karti hai, jaise x > 0 ("kya x greater than 0 hai?") ya x % 2 == 0 ("kya x even hai?").
Picture: ek light switch ya ek yes/no gate. True = gate khula (ise through jaane do), False = gate band (ise phenk do).
Definition Conditions ke andar operators
> greater than · < less than · >= at least · <= at most
== equal to (do equals signs — yeh ek sawaal poochta hai, §0a ke single = se alag)
!= not equal to
% division ke baad remainder : 7 % 2 hai 1, 8 % 2 hai 0
Common mistake Steel-man: "
= aur == same hain."
Woh alike lagte hain, toh yeh ek classic trap hai. Reality: = assign karta hai (x = 5 label stick karta hai), jabki == poochhat hai ("kya yeh equal hain?") aur True ya False return karta hai. Fix: ek equals = "make it so"; do equals = "is it so?".
Common mistake Steel-man: "
% hamesha maths modulus se match karta hai, negatives ke liye bhi."
Non-negative numbers ke liye haan. Lekin Python ka % divisor ka sign follow karta hai, toh -7 % 3 hai 2 (na ki -1), jabki kuch doosri languages -1 deti hain. Fix: jab negatives aa sakti hain, assume mat karo; test karo. Even-check x % 2 == 0 ke liye yeh harmless hai (ek even number ka remainder 0 hoga kisi bhi tarah), lekin possibly-negative data pe filters ke liye yeh dhyan mein rakho.
Intuition Is topic ko yeh kyun chahiye
if condition slot conveyor belt pe guard hai. Ise kuch chahiye jo yes/no jawaab de, aur woh exactly ek Boolean hai. x % 2 == 0 parent ka "kya yeh even hai?" gate hai. Booleans ke bina, filtering ka koi matlab nahi.
Definition Expression vs statement
Ek expression code ka ek piece hai jo ==ek value compute karke produce karta hai ==: x**2, len(w), n if n>0 else 0 sab kuch koi value ban jaate hain. Ek statement kuch karta hai lekin wapas koi value produce nahi karta: x = 5 ya for ...: statements hain.
Picture: ek expression ek vending machine hai — cheezein daalo, ek value nikalti hai. Ek statement ek light switch hai — woh act karta hai, lekin tum iski result ko "hold" nahi kar sakte.
Definition Conditional (ternary) expression
a if cond else b
Ek ternary conditional expression ek condition ke based pe do values mein se ek choose karta hai. Iski exact syntax hai:
a if cond else b
Evaluation order: Python pehle cond evaluate karta hai (§5 se ek Boolean). Agar cond True hai, toh poori cheez value a produce karta hai; agar cond False hai, toh value b produce karta hai. Zaroori baat yeh hai ki yeh ==hamesha ek value produce karta hai == — isliye yeh ek expression hai, statement nahi. Example: n if n > 0 else 0 tab n deta hai jab n positive hai, warna 0.
Intuition Yeh poore topic ki KEY kyun hai
Output slot ek expression hona chahiye , kyunki iski value wahi hai jo nayi list mein append hoti hai. Isliye parent insist karta hai ki output ke andar if/else ternary a if cond else b (ek expression jo ek value yield karta hai) hona chahiye aur ek bare if: statement (jo kuch yield nahi karta) nahi . Poora "Choose-before, Cut-after" rule actually "expressions value slot mein jaate hain, filters guard slot mein jaate hain" hai. Conditional expressions (ternary) dekho.
Figure s04 — left: ek expression (vending machine) hamesha ek value hand back karta hai, toh woh output slot fill kar sakta hai; right: ek statement (switch) act karta hai lekin kuch return nahi karta, toh woh nahi kar sakta.
Definition Common expression pieces
x**2 matlab hai ==x ko power 2 tak raise karna== (yaani x times x). Toh 3**2 hai 9.
len(w) kisi cheez mein items ki sankhya deta hai: len("kiwi") hai 4, len([5,5,5]) hai 3.
Intuition Is topic ko yeh kyun chahiye
Yeh sirf sample output expressions hain jo parent transformation dikhane ke liye use karta hai. Koi bhi expression output slot mein baith sakta hai; x**2 aur len(w) simply woh do hain jinhe examples use karte hain. Template ki koi parwah nahi ki kaun sa — bas yeh important hai ki output part ek value produce kare.
Ab har piece earned hai, toh hum finally recipe [expr for x in iterable if condition] assemble kar sakte hain aur parent ka flagship example left to right padh sakte hain, har part ko naam dete hue:
Fragment
Ab tum jaante ho iska matlab
Built in
[ ... ] aur iski ,
ek nayi list of values banana, comma-separated
§0a, §0b
x**2
expr: ek expression jo ek value produce karta hai
§6, §7
for x in range(10)
ek iterable pe loop , x har item ko re-label karta hai
§1, §2, §3
if x % 2 == 0
Boolean guard sirf survivors ko rakhta hai
§5
Tum ise ek English sentence ki tarah padh sakte ho: "value x**2, har x ke liye 0 se 9 tak, lekin sirf tab jab x even ho."
if guard OPTIONAL hai
Tum ==if condition poori tarah drop kar sakte ho==. [expr for x in iterable] likha (koi guard nahi), har item rakha jaata hai — conveyor belt pe koi guard nahi, toh kuch nahi phenkta. Example: [x**2 for x in range(4)] deta hai [0, 1, 4, 9] (saare chaar items transformed, koi filter nahi).
Intuition Yahan se aage kahan generalize hota hai (multiple
for, multiple if)
Conveyor-belt picture naturally stretch hoti hai: tum ek se zyaada for chain kar sakte ho (belts feeding belts — nested loops, jaise [cell for row in grid for cell in row]) aur ek se zyaada if (kai guards ek row mein, sab pass hone chahiye). Sabse left wala for sabse outer loop hai. Tumhe abhi yeh nahi chahiye — parent note inhe cover karta hai — lekin jaano ki recipe yahan dikhaye single-for, single-if shape se aage bhi scale hoti hai.
value literal and = assignment
Square brackets and comma = a list
Variables a re-stickable name x
Iterables range and generator
colon and indentation block
Expression statement and ternary
Khud test karo — right side cover karo aur reveal karne se pehle har cheez zor se bolo.
Value kya hai, aur literal kya hai?Value data ka ek piece hai (ek number, ek string); literal woh value hai jo code mein directly likhi ho, jaise 5 ya "apple".
Ek single = kya karta hai? Yeh assign karta hai — ek naam ko ek value pe stick karta hai, jaise x = 5. Yeh ek command hai, koi question nahi.
Comma-separated values ke around [ ] kya banata hai? Ek ordered list — values ka ek box, jisme har ek ki fixed position hoti hai, 0 se count karte hue.
Kya comma kisi item ki value ka hissa hai? Nahi — yeh pure syntax hai jo ek item ko doosre se alag karti hai.
for x in ... mein x fixed hai ya changing?Changing — yeh har item se re-attach hota hai baarimaar, har pass pe ek.
Kya ek list comprehension ka loop variable x outer scope mein leak karta hai? Nahi — Python 3 mein yeh comprehension ke private scope mein rehta hai aur bahar ke same naam wale x ko overwrite nahi karta.
range(4) kya produce karta hai?0, 1, 2, 3 — 0 se shuru, 4 se pehle rok deta hai.
Kya range ek generator hai? Nahi — yeh ek reusable sequence object hai; tum ise do baar loop kar sakte ho, index kar sakte ho, ya iski length le sakte ho.
Generator ek phrase mein kya hai? Ek one-shot, lazy iterable — yeh har item tabhi banata hai jab maanga jaaye aur ek pass ke baad used up ho jaata hai.
Iterable ek phrase mein kya hai? Kuch bhi jisse tum items ek ek karke, order mein, nikaal sako.
for line ke end mein colon : kya karta hai?Yeh announce karta hai ki code ka ek block (loop body) follow karta hai; iske neeche indented lines wahi block hain.
for loop kya karta hai?Apna indented body ek iterable ke har item ke liye ek baar run karta hai, loop variable ko us item pe set karke.
r=[] se shuru karke, r.append(7) kya karta hai?7 ko end mein add karta hai, [7] banata hai.
Ek Boolean ke do values kya hote hain? Sirf True ya False.
= aur == mein kya fark hai?= ek naam ko ek value assign karta hai; == poochhat hai "kya yeh equal hain?" aur ek Boolean return karta hai.
x % 2 == 0 kya test karta hai, aur negatives ke saath % ka kya caveat hai?Whether x even hai; % divisor ka sign leta hai, toh jaise -7 % 3 hai 2, na ki -1.
Ternary a if cond else b ki syntax aur evaluation order kya hai? Python pehle cond evaluate karta hai; agar True toh poora expression a yield karta hai, warna b — yeh hamesha ek value produce karta hai.
Output expr ek expression kyun hona chahiye, statement nahi? Kyunki iski produced value wahi hai jo nayi list mein append hoti hai; ek statement store karne ke liye koi value produce nahi karta.
Kya tum if guard omit kar sakte ho? Haan — [expr for x in iterable] har item rakhta hai.
Ternary a if cond else b kahan fit hota hai, aur kyun? expr slot mein (before for), kyunki yeh ek expression hai jo ek value yield karta hai.
3**2 kya hai?9 — 3 ko power 2 tak raise kiya.
For loops — woh engine jiske upar yeh poora topic sugar hai.
range() and iterables — for x in iterable slot ko kya feed karta hai.
Conditional expressions (ternary) — expression-form if/else jo expr ke andar use hoti hai.
map() and filter() — transform (§7) aur filter (§5) ke functional equivalents.
Dictionary and set comprehensions — same foundations, alag brackets.
Generator expressions — lazy cousin; range ke unlike, truly one-shot (§2).
[[List comprehensions — `[expr for x in iterable if condition]` (index 1.2.34)|↑ Back to the parent topic]]