List, Set और Dictionary Comprehension
Comprehension क्या है?
Comprehension मौजूदा data से एक पढ़ने में आसान line में नई list, set या dictionary बनाता है। यह आम pattern “ख़ाली list बनाओ → loop → append” की जगह लेता है।
prices = [120, 450, 80, 999]
# normal loop
with_gst = []
for p in prices:
with_gst.append(round(p * 1.18))
print(with_gst)
# list comprehension – same result
with_gst = [round(p * 1.18) for p in prices]
print(with_gst)इसे ऐसे पढ़ें: [ expression for item in iterable if condition ] → “iterable के हर उस item के लिए expression बनाओ जो condition पास करे”।
if से filter करना
marks = {"Asha": 91, "Ravi": 58, "Neha": 76, "Kabir": 34, "Isha": 88}
passed = [name for name, m in marks.items() if m >= 40]
toppers = [name for name, m in marks.items() if m >= 85]
print("Passed :", passed)
print("Toppers:", toppers)Expression के अंदर if-else
Filter नहीं, बल्कि दो values में से चुनने के लिए if … else … को for से पहले लिखें।
marks = [91, 58, 76, 34, 88] result = ["Pass" if m >= 40 else "Fail" for m in marks] grades = ["A" if m >= 85 else "B" if m >= 60 else "C" if m >= 40 else "F" for m in marks] print(result) print(grades)
| स्थान | उद्देश्य | उदाहरण |
|---|---|---|
for के बाद if | कुछ items ही रखें (filter) | [m for m in marks if m >= 40] |
for से पहले if … else | हर item को दो में से एक value में बदलें | ["P" if m >= 40 else "F" for m in marks] |
Dictionary comprehension
items = ["kaju katli", "ghewar", "rasmalai"]
price = [900, 650, 700]
menu = {name.title(): p for name, p in zip(items, price)}
print(menu)
discounted = {k: round(v * 0.9) for k, v in menu.items() if v > 680}
print(discounted)
# swap keys and values
by_price = {v: k for k, v in menu.items()}
print(by_price[650])Set comprehension
emails = ["riya@gmail.com", "AMAN@yahoo.com", "neha@gmail.com", "aman@yahoo.com"]
domains = {e.split("@")[1].lower() for e in emails}
unique_users = {e.lower() for e in emails}
print(sorted(domains))
print(len(emails), "emails,", len(unique_users), "unique")Nested loops और flatten करना
sections = [["Asha", "Ravi"], ["Neha"], ["Kabir", "Isha", "Om"]]
# loops are written in the same order as normal nested for-loops
all_students = [s for section in sections for s in section]
print(all_students)
table = [[r * c for c in range(1, 4)] for r in range(1, 4)]
for row in table:
print(row)अगर comprehension में दो से ज़्यादा for या लंबी condition चाहिए, तो सामान्य loop लिखें। चालाक code से साफ़ code बेहतर है।
असली उदाहरण: बिगड़ी student list साफ़ करना
raw = [" asha sharma ", "RAVI kumar", "", "neha verma", " ", "Kabir Singh"]
clean = [" ".join(name.split()).title() for name in raw if name.strip()]
initials = {name: "".join(part[0] for part in name.split()) for name in clean}
print(clean)
print(initials)क्या comprehension तेज़ है?
import timeit
loop_code = """
result = []
for n in range(10000):
result.append(n * 2)
"""
comp_code = "result = [n * 2 for n in range(10000)]"
t_loop = timeit.timeit(loop_code, number=300)
t_comp = timeit.timeit(comp_code, number=300)
print("comprehension faster:", t_comp < t_loop)आम तौर पर हाँ, लगभग 20–40%, क्योंकि append optimised C code के अंदर होता है। पर comprehension मुख्य रूप से readability के लिए चुनें; printing या saving जैसे side effects के लिए सामान्य loop लें।
आम ग़लतियाँ
| ग़लती | सुधार |
|---|---|
[x for x in data if x > 0 else 0] → SyntaxError | if-else को for से पहले रखें: [x if x > 0 else 0 for x in data] |
सिर्फ़ print के लिए comprehension: [print(x) for x in data] | सामान्य for loop लिखें |
| बहुत लंबा nested comprehension | Loop या helper function में बाँटें |
(x for x in data) को tuple समझना | यह generator है; tuple(...) लें |
अभ्यास
- Numbers की list से सिर्फ़ odd numbers के cubes की list बनाएँ।
{"pen": 10, "book": 250, "bag": 799}से 18% GST जोड़कर नई dictionary बनाएँ।- किसी sentence में आने वाले सभी vowels का set बनाएँ।
[[1, 2], [3], [4, 5, 6]]को flatten करके सिर्फ़ even numbers रखें।
सारांश
[expr for x in data if cond]list बनाता है;{k: v for …}dictionary;{expr for …}set।forके बादiffilter करता है;forसे पहलेif/elsevalue चुनता है।- कई
forसामान्य nested-loop क्रम में चलते हैं। - Readability पहले: जटिल हो या side effects हों तो loop लिखें।
