TypeError: unhashable type: 'slice'
पायथन डिक्शनरी में मानों को लिस्ट की तरह स्लाइस नहीं किया जा सकता। ऐसा इसलिए है क्योंकि डिक्शनरी में कस्टम की मान हो सकते हैं। वे शून्य से इंडेक्स्ड नहीं होते। यदि आप डिक्शनरी को लिस्ट की तरह स्लाइस करने का प्रयास करते हैं, तो आपको "TypeError: unhashable type: 'slice'" एरर मिलेगी।
यह गाइड चर्चा करती है कि इस एरर का क्या मतलब है और आप इसे अपने कोड में क्यों देखते हैं। यह इस एरर के एक उदाहरण पर चर्चा करती है ताकि आप इसे हल कर सकें।
स्लाइसिंग क्या है?
स्लाइस स्ट्रिंग, लिस्ट, या टुपल जैसे सीक्वेंस का सबसेट होता है। नाम स्लाइस के उद्देश्य को दर्शाता है: यह सीक्वेंस का "एक टुकड़ा" है।
निम्न प्रोग्राम पर विचार करें:
news_sites = ["New York Times", "Washington Post", "CNN"] print(news_sites[:2])
यह कोड हमारे "news_sites" लिस्ट में पहले दो मान प्राप्त करता है और उन्हें कंसोल पर प्रिंट करता है। हमारा कोड रिटर्न करता है: ['New York Times', 'Washington Post']।
यह स्लाइसिंग का एक उदाहरण है। आप लिस्ट से दो ऑब्जेक्ट्स प्राप्त कर रहे हैं। कोलन और इंडेक्स मान निर्दिष्ट करके, आप पायथन को बता रहे हैं कि किन ऑब्जेक्ट्स को प्राप्त करना है।
डिक्शनरी को लिस्ट की तरह स्लाइस नहीं किया जा सकता। डिक्शनरी में कोई इंडेक्स नंबर नहीं होते और इसलिए यह सिंटैक्स लागू नहीं होता।
उदाहरण परिदृश्य
कंप्यूटर हार्डवेयर स्टोर पर बिक्री के लिए कीबोर्ड के बारे में जानकारी प्रदर्शित करने वाला प्रोग्राम बनाएं। शुरू करने के लिए, कीबोर्ड के बारे में डेटा के साथ एक डिक्शनरी परिभाषित करें:
keyboard = {
"name": "Huntsman Mini",
"brand": "Razer",
"price": 119.99,
"switch_type": "Razer Switches",
}
प्रोग्राम कीबोर्ड के नाम, इसकी कीमत, कीबोर्ड के ब्रांड, और कीबोर्ड द्वारा उपयोग किए जाने वाले स्विच टाइप के बारे में जानकारी स्टोर करता है। आप केवल दिखाना चाहते हैं: कीबोर्ड का नाम, कीबोर्ड का ब्रांड, और इसकी कीमत।
ऐसा करने के लिए, हमारे डिक्शनरी में पहले तीन आइटम प्राप्त करने के लिए स्लाइसिंग का उपयोग करें। ये आइटम कीबोर्ड का नाम, ब्रांड, और कीमत हैं:
show_to_customer = keyboard[:3]
यह कोड डिक्शनरी में पहले तीन आइटम प्राप्त करता है। अगला, इस लिस्ट पर इटरेट करने और प्रत्येक आइटम को कंसोल पर प्रिंट करने के लिए फोर लूप का उपयोग करें:
for s in show_to_customer:
print(s[1])
आप "show_to_customer" वेरिएबल में प्रत्येक रिकॉर्ड से मान प्राप्त करने के लिए इंडेक्सिंग का उपयोग करते हैं। फिर आप print() स्टेटमेंट का उपयोग करके उस मान को कंसोल पर प्रिंट करते हैं।
आइए कोड चलाएं और देखें क्या होता है:
Traceback (most recent call last): File "main.py", line 8, inshow_to_customer = keyboard[:3] TypeError: unhashable type: 'slice'
हमारा कोड एरर रिटर्न करता है।
समाधान
लिस्ट्स के विपरीत, डिक्शनरी को स्लाइस नहीं किया जा सकता। आप डिक्शनरी में किसी भी आइटम को स्लाइसिंग का उपयोग करके प्राप्त नहीं कर सकते क्योंकि डिक्शनरी में इंडेक्स नंबर नहीं होते। डेटा की-वैल्यू पेयर्स में स्टोर होता है। क्योंकि डिक्शनरी को स्लाइस नहीं किया जा सकता, पहले का for लूप उपयुक्त नहीं है।
आपको सीधे निर्दिष्ट करना होगा कि आप डिक्शनरी से कौन से मान एक्सेस करना चाहते हैं। ऐसा करने के लिए, डिक्शनरी में उपयुक्त की नामों को रेफर करें।
कोड को हल करने के लिए, आइए व्यक्तिगत रूप से प्रत्येक मान को एक्सेस करें जिसे आप कंसोल पर प्रदर्शित करना चाहते हैं:
keyboard = {
"name": "Huntsman Mini",
"brand": "Razer",
"price": 119.99,
"switch_type": "Razer Switches",
}
print("Name: " + keyboard["name"])
print("Brand: " + keyboard["brand"])
print("Price: $" + str(keyboard["price"]))
प्रत्येक print() स्टेटमेंट डिक्शनरी से एक अलग मान को रेफर करता है। पहला प्रिंट स्टेटमेंट कंसोल पर लेबल "Name: " प्रिंट करता है, उसके बाद डिक्शनरी में "name" का मान। दूसरा और तीसरा स्टेटमेंट क्रमशः "brand" और "price" के मान को कंसोल पर प्रिंट करते हैं।
आप str() मेथड का उपयोग करके "price" मान को स्ट्रिंग में बदलते हैं ताकि इसे कन्केटनेशन ऑपरेटर (+) का उपयोग करके "Price: $" लेबल के साथ जोड़ा जा सके।
आइए अपना नया प्रोग्राम चलाएं:
Name: Huntsman Mini Brand: Razer Price: $119.99
कोड सफलतापूर्वक उन तीन जानकारियों को प्रिंट करता है जिन्हें आप कंसोल पर प्रदर्शित करना चाहते थे। यूज़र कीबोर्ड का नाम, ब्रांड, और कीमत देख सकता है।
निष्कर्ष
"TypeError: unhashable type: 'slice'" एरर तब उठाई जाती है जब आप स्लाइसिंग सिंटैक्स का उपयोग करके डिक्शनरी से आइटम्स एक्सेस करने का प्रयास करते हैं। इस एरर को हल करने के लिए, सुनिश्चित करें कि आप डिक्शनरी से सीधे उन आइटम्स को रेफर करते हैं जिन्हें आप एक्सेस करना चाहते हैं।
अब आपके पास इस एरर को एक एक्सपर्ट की तरह हल करने का ज्ञान है!