Dictionaries
Key-value mapping, methods, और आंतरिक रचना
यह क्यों मायने रखता है
Hash maps औसतन O(1) समय में समस्याओं के एक बड़े वर्ग को सुलझा देते हैं।
मूल विचार
एक dict एक तेज़ lookup table है: key → value। Keys hashable होनी चाहिए (यानी: strings, numbers, tuples — lists नहीं)। Python 3.7 से, dicts insertion का क्रम याद रखते हैं।
आज़माकर देखिए
बनाना, lookup, default मान:
prices = {"apple": 1.0, "banana": 0.5}
prices["cherry"] = 2.5
print(prices)
# .get() returns a default instead of raising KeyError
print(prices.get("grape", 0.0))
# setdefault() inserts if missing, then returns the value
prices.setdefault("date", 3.0)
print(prices)
गिनती — चिर-परिचित "frequency" मुहावरा:
from collections import Counter
text = "mississippi"
counts = Counter(text)
print(counts)
print(counts.most_common(2))
Iterating: items() (key, value) tuples देता है — unpacking के लिए एकदम सही।
scores = {"Ada": 95, "Linus": 88, "Margaret": 99}
for name, score in scores.items():
print(f"{name:>10}: {score}")
# Dict comprehension
inverted = { score: name for name, score in scores.items() }
print(inverted)
मुख्य dict methods (ज़रूर जानें)
| Method | यह क्या करता है | उदाहरण |
| --- | --- | --- |
| get(k, d) | सुरक्षित lookup | d.get("x", 0) |
| keys() | keys का view | list(d.keys()) |
| values() | values का view | list(d.values()) |
| items() | जोड़ों का view | list(d.items()) |
| update(...) | merge/update | d.update({"x":1}) |
| pop(k) | key हटाता है | d.pop("x") |
| popitem() | आख़िरी जोड़ा हटाता है | d.popitem() |
| setdefault(k, d) | get या set | d.setdefault("x", 0) |
| copy() | shallow copy | d.copy() |
| fromkeys(keys, v) | प्रारंभ | dict.fromkeys(keys, 0) |
Grouping pattern
setdefault "items को key के अनुसार बकेट में बाँटना" एक पंक्ति में कर देता है:
groups = {}
for item in items:
groups.setdefault(item[0], []).append(item)
Two Sum pattern
चिर-परिचित "जो देखा उसे याद रखो" वाली hash तरकीब — O(n²) के बजाय O(n):
def two_sum(nums, target):
seen = {}
for i, x in enumerate(nums):
need = target - x
if need in seen:
return [seen[need], i]
seen[x] = i
झटपट जाँच
- प्र: अगर key मौजूद न हो तो
dict.get(k)क्या लौटाता है? उ:None(या आपके दिए गए default)।
छोटे अभ्यास
- किसी string में characters गिनिए।
- पहला दोहराया गया number ढूँढिए।
- एक word → count dictionary बनाइए।
क्या करें और क्या न करें
- करें keys जाँचने के लिए
in dइस्तेमाल करें। - करें वैकल्पिक access के लिए
getको प्राथमिकता दें। - न करें किसी dict पर iterate करते समय उसे न बदलें।
- न करें unhashable keys (
list,dict,set) इस्तेमाल न करें।
और गहराई में — dictionaries कैसे काम करते हैं
Hash table की आंतरिक रचना
- Hash table: keys को hash करके table में एक index बनाया जाता है।
- Collisions: अलग-अलग keys एक ही index पर map हो सकती हैं।
- समाधान: CPython probing के साथ open addressing इस्तेमाल करता है (औसतन तेज़)।
- Load factor: जैसे-जैसे table भरता है, Python lookups तेज़ रखने के लिए उसे फिर से आकार देता है।
Hashability के नियम
- Hashable:
int,float,str,tuple(अगर इसके तत्व hashable हों),frozenset। - Unhashable:
list,dict,set।
क्रम की गारंटी
- Python 3.7+ insertion का क्रम सुरक्षित रखता है (एक आधिकारिक भाषा गारंटी)।
आम ग़लतियाँ
- ग़लती:
[]से ग़ायब keys तक पहुँचना। समाधान:get()इस्तेमाल करें। - ग़लती: अनजाने में values को अधिलेखित करना। समाधान: assignment से पहले keys की जाँच करें।
- ग़लती: किसी list को key के रूप में इस्तेमाल करना। समाधान: tuple या
frozensetइस्तेमाल करें। - ग़लती: यह मान लेना कि
dict.keys()एक list है। समाधान: ज़रूरत पड़ने परlist(...)से लपेटें।
मुख्य बातें
- Keys hashable होनी चाहिए; values कुछ भी हो सकती हैं।
dict.get(k, default)KeyErrorसे बचाता है;setdefaultन मिलने पर डालता है।collections.Counterfrequency गिनती के लिए पहली पसंद है।- Dict comprehensions:
{k: v for ... if ...}list comprehensions का दर्पण हैं। get,set,in,popऔसतन ~O(1) हैं; भारी collisions में सबसे ख़राब स्थिति O(n)।