Python में डिक्शनरी (dict) एक डेटा स्ट्रक्चर है जो हैश करने योग्य की को वैल्यू से जोड़ती है। दूसरी प्रोग्रामिंग भाषाओं में इसे आकार बदल सकने वाली हैश टेबल, हैशमैप या एसोसिएटिव ऐरे कहा जाता है।
Python में बिल्ट-इन मैपिंग टाइप सिर्फ़ डिक्शनरी ही है।
Keys हैश करने योग्य और पूरी डिक्शनरी में अद्वितीय होनी चाहिए।
की के टाइप में numbers, str या (अपरिवर्तनीय वैल्यू वाले) tuples शामिल हो सकते हैं।
की परिवर्तनीय डेटा स्ट्रक्चर नहीं हो सकतीं, जैसे lists, dict या set।
Python 3.7 से यह तय है कि dict में एंट्रियाँ जिस क्रम में डाली गई हों, की का क्रम भी वही रहेगा।
values किसी भी डेटा टाइप या स्ट्रक्चर की हो सकती हैं।
वैल्यू मनमाने ढंग से एक-दूसरे के अंदर भी रखी जा सकती हैं, यानी इनमें ऐरे के अंदर ऐरे, उप-डिक्शनरी और दूसरे मनमाने या मिश्रित डेटा स्ट्रक्चर शामिल हो सकते हैं।
किसी की को देखकर डिक्शनरी औसतन स्थिर समय में वैल्यू निकाल सकती है (इसमें कोई फ़र्क नहीं पड़ता कि कितनी एंट्रियाँ हैं)।
list या array में वैल्यू ढूँढने (जब index की जगह पता न हो) की तुलना में dict काफ़ी ज़्यादा मेमोरी लेती है, लेकिन वैल्यू बहुत तेज़ी से निकालती है।
जब चीज़ों का संग्रह बड़ा हो और उन्हें बार-बार पढ़ना और बदलना पड़े, तब डिक्शनरी ख़ास तौर पर काम आती है।
डिक्शनरी कई तरीकों से बनाई जा सकती है।
सबसे आसान दो तरीके हैं: dict() कंस्ट्रक्टर का उपयोग करना, या dict लिटरल लिखना।
dict() क्लास का कंस्ट्रक्टरdict() (डिक्शनरी क्लास का कंस्ट्रक्टर) के साथ की-वैल्यू जोड़ों का कोई भी इटरेबल दिया जा सकता है, या <name>=<value> आर्गुमेंट की एक श्रृंखला दी जा सकती है:
#Passing a list of key,value tuples.
>>> wombat = dict([('name', 'Wombat'),('speed', 23),('land_animal', True)])
{'name': 'Wombat', 'speed': 23, 'land_animal': True}
#Using key=value arguments.
>>> bear = dict(name="Black Bear", speed=40, land_animal=True)
{'name': 'Black Bear', 'speed': 40, 'land_animal': True}
dict को सीधे डिक्शनरी लिटरल के रूप में भी लिखा जा सकता है, जिसमें घुंघराले ब्रैकेट ({}) के अंदर key : value जोड़े रखे जाते हैं:
>>> whale = {"name": "Blue Whale", "speed": 35, "land_animal": False}
{'name': 'Blue Whale', 'speed': 35, 'land_animal': False}
आप डिक्शनरी में किसी एंट्री को चौकोर ब्रैकेट ([]) में की लिखकर पढ़ सकते हैं।
अगर dict में कोई की मौजूद न हो, तो KeyError मिलती है:
>>> bear["speed"]
40
>>> bear["color"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'color'
किसी एंट्री को .get(<key>, <default value>) मेथड से पढ़ने पर KeyError से बचा जा सकता है:
>>> bear.get("color", 'not found')
'not found'
किसी एंट्री की की को असाइन करके उसकी वैल्यू बदली जा सकती है:
#Assigning the value "Grizzly Bear" to the name key.
>>> bear["name"] = "Grizzly Bear"
{'name': 'Grizzly Bear', 'speed': 40, 'land_animal': True}
>>> whale["speed"] = 25
{'name': 'Blue Whale', 'speed': 25, 'land_animal': False}
इसी तरह नए key:value जोड़े भी जोड़े जा सकते हैं:
# Adding a new "color" key with a new "tawney" value.
>>> bear["color"] = 'tawney'
{'name': 'Grizzly Bear', 'speed': 40, 'land_animal': True, 'color': 'tawney'}
>>> whale["blowholes"] = 1
{'name': 'Blue Whale', 'speed': 25, 'land_animal': False, 'blowholes': 1}
.pop() करना)डिक्शनरी की कोई एंट्री हटाने के लिए .pop(<key>) मेथड का उपयोग किया जा सकता है।
.pop() उस (key, value) जोड़े को हटा देता है और value को आगे इस्तेमाल के लिए लौटा देता है।
.get() की तरह .pop(<key>) भी एक दूसरा आर्गुमेंट लेता है (dict.pop(<key>, <default value>)), जो की न मिलने पर लौटा दिया जाता है।
इससे KeyError आने से बचाव होता है:
#Using .pop() removes both the key and value, returning the value.
>>> bear.pop("name")
'Grizzly Bear'
#The "name" key is now removed from the dictionary.
#Attempting .pop() a second time will throw a KeyError.
>>> bear.pop("name")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'name'
#Using a default argument with .pop() will prevent a KeyError from a missing key.
>>> bear.pop("name", "Unknown")
'Unknown'
for item in dict या while item से डिक्शनरी पर लूप चलाने पर डिफ़ॉल्ट रूप से सिर्फ़ की पर इटरेशन होता है।
उसी लूप के अंदर चौकोर ब्रैकेट का उपयोग करके वैल्यू भी पढ़ी जा सकती हैं:
>>> for key in bear:
>>> print((key, bear[key])) #this forms a tuple of (key, value) and prints it.
('name', 'Black Bear')
('speed', 40)
('land_animal', True)
आप .items() मेथड का भी उपयोग कर सकते हैं, जो अपने आप (key, value) टपल लौटाता है:
#dict.items() forms (key, value tuples) that can be unpacked and iterated over.
>>> for key, value in whale.items():
>>> print(key, ":", value)
name : Blue Whale
speed : 25
land_animal : False
blowholes : 1
इसी तरह, .keys() मेथड keys लौटाता है और .values() मेथड values लौटाता है।
इस अभ्यास में आप एक इन्वेंटरी सिस्टम संभालेंगे।
इन्वेंटरी को चीज़ों के नाम के अनुसार व्यवस्थित किया जाना चाहिए और उसमें उपलब्ध चीज़ों की संख्या का हिसाब रखना चाहिए।
आपको इन्वेंटरी में चीज़ें जोड़ने का काम भी करना होगा।
जब भी कोई चीज़ किसी दी गई ऐरे में आए, उस चीज़ की मात्रा इन्वेंटरी में 1 से बढ़ा देनी चाहिए।
आपको इन्वेंटरी से चीज़ें हटाने का काम भी करना होगा। इसके लिए कहने पर उनकी मात्रा 1 से घटानी होगी।
अंत में, आपको एक ऐसा फंक्शन बनाना होगा जो किसी दी गई इन्वेंटरी की सारी की-वैल्यू जोड़े tuples की एक list के रूप में लौटाए।
create_inventory(<input list>) फंक्शन बनाइए जो चीज़ों की एक इनपुट ऐरे से एक इन्वेंटरी बनाता है।
इसे एक dict लौटाना चाहिए जिसमें हर चीज़ का नाम उसकी मात्रा के साथ जुड़ा हो।
>>> create_inventory(["coal", "wood", "wood", "diamond", "diamond", "diamond"])
{"coal":1, "wood":2, "diamond":3}
add_items(<inventory dict>, <item list>) फंक्शन बनाइए, जो चीज़ों की एक ऐरे को पास की गई इन्वेंटरी में जोड़ता है:
>>> add_items({"coal":1}, ["wood", "iron", "coal", "wood"])
{"coal":2, "wood":2, "iron":1}
decrement_items(<inventory dict>, <items list>) फंक्शन बनाइए, जो चीज़ों की एक list लेता है।
हर बार जब कोई चीज़ list में आए, आपके फंक्शन को उस चीज़ की मात्रा से 1 घटाना चाहिए:
>>> decrement_items({"coal":3, "diamond":1, "iron":5}, ["diamond", "coal", "iron", "iron"])
{"coal":2, "diamond":0, "iron":3}
इन्वेंटरी में किसी भी चीज़ की मात्रा 0 से नीचे नहीं जानी चाहिए।
अगर कोई चीज़ इनपुट list में उपलब्ध मात्रा से ज़्यादा बार आती है, तो उस चीज़ की मात्रा 0 ही रहनी चाहिए।
एक बार मात्रा शून्य हो जाने के बाद घटाने के और अनुरोधों को अनदेखा कर देना चाहिए।
>>> decrement_items({"coal":2, "wood":1, "diamond":2}, ["coal", "coal", "wood", "wood", "diamond"])
{"coal":0, "wood":0, "diamond":1}
remove_item(<inventory dict>, <item>) फंक्शन बनाइए, जो किसी चीज़ को और उसकी मात्रा को इन्वेंटरी से पूरी तरह हटा देता है:
>>> remove_item({"coal":2, "wood":1, "diamond":2}, "coal")
{"wood":1, "diamond":2}
अगर वह चीज़ इन्वेंटरी में न मिले, तो फंक्शन को मूल इन्वेंटरी बिना बदले ही लौटानी चाहिए।
>>> remove_item({"coal":2, "wood":1, "diamond":2}, "gold")
{"coal":2, "wood":1, "diamond":2}
list_inventory(<inventory dict>) फंक्शन बनाइए, जो एक इन्वेंटरी लेता है और (item, quantity) tuples का एक ऐरे लौटाता है।
इस ऐरे में सिर्फ उपलब्ध चीज़ें ही शामिल होनी चाहिए (यानी जिनकी मात्रा शून्य से ज़्यादा हो):
>>> list_inventory({"coal":7, "wood":11, "diamond":2, "iron":7, "silver":0})
[('coal', 7), ('diamond', 2), ('iron', 7), ('wood', 11)]
Exercism पर साइन अप कीजिए और Python को 17 कॉन्सेप्ट146 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।