डिक्शनरीज़
लिस्ट्स आपको चीज़ों को स्थिति (position) से ढूँढने देती हैं। लेकिन अक्सर आप किसी चीज़ को नाम से ढूँढना चाहते हैं। "मुझे आइटम 3 दो" नहीं, बल्कि "मुझे आरव का स्कोर दो"। एक डिक्शनरी डेटा को key-value जोड़ों के रूप में स्टोर करती है: आप एक value को उसकी key से ढूँढते हैं, न कि उसकी स्थिति से।
एक डिक्शनरी बनाना
प्रत्येक key और value के बीच एक कोलन के साथ कर्ली ब्रेसेस, और जोड़ों के बीच कॉमा। Keys लगभग हमेशा स्ट्रिंग्स होती हैं। Values कुछ भी हो सकती हैं: नंबर, स्ट्रिंग्स, अन्य लिस्ट्स, यहाँ तक कि अन्य डिक्शनरीज़ भी।
player = {
"name": "आरव",
"score": 87,
"level": 5,
"alive": True,
}Values तक पहुँचना
Value प्राप्त करने के लिए key के साथ स्क्वायर ब्रैकेट्स का उपयोग करें। यदि key मौजूद नहीं है, तो Python KeyError उठाता है। .get() का उपयोग करें जब आपको यकीन न हो कि key वहाँ है: यह क्रैश होने के बजाय None लौटाता है, या आपके द्वारा निर्दिष्ट डिफ़ॉल्ट value।
player = {"name": "आरव", "score": 87}
player["name"] # "आरव"
player["score"] # 87
player["lives"] # KeyError (key doesn't exist)player.get("score") # 87
player.get("lives") # None (no error, returns None by default)
player.get("lives", 3) # 3 (use this default if key is absent).get() तब सुरक्षित होता है जब कोई key गायब हो सकती है:
count = inventory.get("arrows", 0) # 0 if "arrows" isn't in the dictजोड़ना और अपडेट करना
स्क्वायर ब्रैकेट्स के साथ एक key को असाइन करें। यदि key पहले से मौजूद है, तो value बदल दी जाती है। यदि यह अभी तक मौजूद नहीं है, तो एक नई एंट्री बनाई जाती है। पूरी अन्य डिक्शनरी को एक बार में मर्ज करने के लिए .update() का उपयोग करें।
player = {"name": "आरव", "score": 87}
player["score"] = 92 # update existing
player["level"] = 5 # add new keyextras = {"level": 5, "alive": True}
player.update(extras) # adds/overwrites with keys from extrasआइटम्स हटाना
एंट्रीज़ हटाने के चार तरीके। .pop() एक key को हटाता है और आपको value वापस देता है। .pop() एक डिफ़ॉल्ट के साथ तब सुरक्षित है जब key वहाँ नहीं हो सकती। del बिना रिटर्न value के एक key को हटाता है। .clear() पूरी डिक्शनरी को खाली कर देता है।
player = {"name": "आरव", "score": 87, "level": 5}
player.pop("level") # removes "level" and returns 5
player.pop("lives", None) # safe pop, returns None if key absent
del player["score"] # removes "score", no return value
player.clear() # removes everything.pop() एक डिफ़ॉल्ट के साथ उस key को हटाने का सबसे सुरक्षित तरीका है जो शायद मौजूद न हो।
इटरेट करना
तीन व्यू आपको एक डिक्शनरी के विभिन्न हिस्सों के माध्यम से लूप करने देते हैं। केवल dict को इटरेट करने से आपको keys मिलती हैं। .values() values देता है। .items() दोनों एक साथ देता है और यही आप सबसे ज़्यादा उपयोग करेंगे: प्रत्येक जोड़ी को साफ़, पठनीय लूप्स के लिए दो नामों में अनपैक करें।
player = {"name": "आरव", "score": 87, "level": 5}
for key in player: # iterate keys (most common)
print(key)
for key in player.keys(): # same, explicit keys view
print(key)
for value in player.values(): # just the values
print(value)
for key, value in player.items(): # both, most useful
print(f"{key}: {value}").items() यही आप सबसे ज़्यादा उपयोग करेंगे। प्रत्येक जोड़ी को दो नामों में अनपैक करना लूप को पठनीय बनाता है।
सदस्यता जाँचना
in जाँचता है कि क्या एक key डिक्शनरी में मौजूद है। यह values को नहीं जाँचता, केवल keys को। यह जाँचने के लिए कि कोई चीज़ मौजूद नहीं है, not in का उपयोग करें।
player = {"name": "आरव", "score": 87}
"name" in player # True
"lives" in player # False
"lives" not in player # Truein केवल keys की जाँच करता है। Values जाँचने के लिए, in player.values() का उपयोग करें, हालाँकि यह शायद ही कभी आवश्यक होता है।
नेस्टेड डिक्शनरीज़
Values स्वयं डिक्शनरीज़ हो सकती हैं। इसी तरह आप कई स्तरों के साथ संरचित डेटा का प्रतिनिधित्व करते हैं: एक खिलाड़ी जिसका एक स्टैट्स सेक्शन है, उप-सेक्शन्स के साथ एक कॉन्फ़िग फ़ाइल। स्क्वायर ब्रैकेट्स के दो सेट एक नेस्टेड value तक पहुँचते हैं: पहला बाहरी key चुनता है, दूसरा आंतरिक key चुनता है।
users = {
"आरव": {"score": 87, "level": 5},
"रिया": {"score": 74, "level": 3},
}
users["आरव"]["score"] # 87
users["रिया"]["level"] # 3चेन किए गए स्क्वायर ब्रैकेट्स के साथ एक्सेस करें। गहरी नेस्टेड संरचनाओं के लिए, यह बोझिल हो सकता है, इसलिए जहाँ आप कर सकते हैं, नेस्टिंग को उथला रखें।
setdefault
.setdefault() एक key को पढ़ता है यदि वह मौजूद है, या यदि वह नहीं है तो उसे एक डिफ़ॉल्ट value पर सेट करता है, फिर value लौटाता है। यह तब उपयोगी होता है जब आपको एक key के मौजूद होने की आवश्यकता हो लेकिन यदि वह पहले से वहाँ है तो उसे ओवरराइट नहीं करना चाहते।
inventory = {}
inventory.setdefault("arrows", 0) # sets "arrows": 0, returns 0
inventory.setdefault("arrows", 10) # "arrows" already exists, no change, returns 0यह पहले key के अस्तित्व की जाँच किए बिना समूहीकृत संरचनाओं के निर्माण के लिए उपयोगी है:
groups = {}
for name, team in players:
groups.setdefault(team, []).append(name)collections.defaultdict और Counter
मानक लाइब्रेरी में दो dict उपवर्ग (subclasses) हैं जो सामान्य पैटर्न्स को स्वचालित रूप से संभालते हैं। defaultdict गायब keys के लिए एक डिफ़ॉल्ट value बनाता है ताकि आपको कभी KeyError न मिले। Counter गिनता है कि प्रत्येक आइटम किसी अनुक्रम में कितनी बार दिखाई देता है और परिणाम आपको एक dict के रूप में देता है।
collections import
defaultdict और Counter को मानक लाइब्रेरी से इम्पोर्ट करने की आवश्यकता है। इम्पोर्ट्स Modules अध्याय में कवर किए गए हैं।
from collections import defaultdict
groups = defaultdict(list)
for name, team in players:
groups[team].append(name) # no KeyError if team is newfrom collections import Counter
words = ["cat", "dog", "cat", "bird", "cat", "dog"]
counts = Counter(words)
# Counter({'cat': 3, 'dog': 2, 'bird': 1})
counts.most_common(2) # [('cat', 3), ('dog', 2)]Counter बहुत सारे "एक लूप में चीज़ें गिनने" वाले बॉयलरप्लेट को बचाता है।
व्यवहार में
एक स्कोर ट्रैकर बनाना और सभी एंट्रीज़ के साथ एक सारांश प्रिंट करना:
scores = {"आरव": 87, "रिया": 74, "नेहा": 92, "विवेक": 55}
total = sum(scores.values())
average = total / len(scores)
print(f"Players: {len(scores)}")
print(f"Average: {average:.1f}")
print(f"Highest: {max(scores.values())}")
print(f"Lowest: {min(scores.values())}")
print()
for name, score in scores.items():
print(f" {name}: {score}")
