Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Python

पायथन TypeError: unhashable type: 'dict' समाधान

पायथन भाषा इस बारे में विशिष्ट है कि डिक्शनरी में कुंजी के रूप में क्या उपयोग किया जा सकता है। पायथन डिक्शनरी में, सभी कुंजियाँ हैशेबल होनी चाहिए।

यदि आप डिक्शनरी में कुंजी जोड़ते समय अनहैशेबल कुंजी प्रकार का उपयोग करने का प्रयास करते हैं, तो आपको "TypeError: unhashable type: 'dict'" त्रुटि का सामना करना पड़ेगा।

इस गाइड में, हम बात करते हैं कि इस त्रुटि का क्या अर्थ है और यह क्यों उठाई जाती है। हम इस त्रुटि का एक उदाहरण देखते हैं ताकि आप सीख सकें कि इसे अपने कोड में कैसे हल किया जाए।

TypeError: unhashable type: 'dict'

डिक्शनरी में दो भाग होते हैं: कुंजियाँ और मान। कुंजियाँ वे पहचानकर्ता हैं जो मान से बंधे होते हैं। जब आप किसी कुंजी को संदर्भित करते हैं, तो आप उस कुंजी से जुड़े मान को पुनः प्राप्त कर पाएंगे।

केवल हैशेबल ऑब्जेक्ट्स डिक्शनरी में कुंजी हो सकते हैं। स्ट्रिंग्स, इंटीजर्स, टपल्स, और फ्रोज़नसेट्स जैसे इम्यूटेबल ऑब्जेक्ट्स हैशेबल होते हैं, कुछ अपवादों के साथ। इसलिए डिक्शनरी को डिक्शनरी में कुंजी के रूप में उपयोग नहीं किया जा सकता।

डिक्शनरी में आइटम जोड़ने के लिए, आपको एक वैध हैशेबल कुंजी निर्दिष्ट करनी होगी। उदाहरण के लिए, "name" एक वैध कुंजी है, लेकिन { "name": "test" } नहीं है।

एक उदाहरण परिदृश्य

यहां, हम एक प्रोग्राम लिखते हैं जो उन सभी केक को एक डिक्शनरी से दूसरी डिक्शनरी में जोड़ता है जो बेकरी में पांच बार से अधिक बिके हैं।

केक की एक सूची घोषित करके शुरू करें जिसमें प्रत्येक केक के बारे में डिक्शनरी हो। हम एक डिक्शनरी भी परिभाषित करते हैं जिसमें हम उन केक को संग्रहीत कर सकते हैं जो पांच बार से अधिक बिके हैं।

cakes = [
    { "name": "Black Forest Gateau", "sold": 3 },
    { "name": "Carrot Cake", "sold": 7 },
    { "name": "Coconut and Lime Cake", "sold": 9 }
]
sold_more_than_five = {}

हमारी "cakes" सूची में तीन डिक्शनरी हैं। प्रत्येक डिक्शनरी में दो कुंजियाँ और मान हैं। कुंजी नाम "cake" और "sold" हैं।

अब, हम एक for लूप लिखते हैं जो हमारी केक की सूची के माध्यम से जाता है और उनको ढूंढता है जो पांच बार से अधिक बिके हैं। उन केक को "sold_more_than_five" डिक्शनरी में जोड़ा जाएगा:

for c in cakes:
    if c["sold"] > 5:
        sold_more_than_five[c] = c["sold"]
        print(c["name"] + " has been sold more than five times.")
print(sold_more_than_five)

हमारे for लूप में, हम तुलना करते हैं कि प्रत्येक डिक्शनरी में "sold" का मान 5 से अधिक है या नहीं। यदि है, तो वह आइटम हमारी "sold_more_than_five" डिक्शनरी में जोड़ा जाता है। फिर, कंसोल पर एक संदेश प्रिंट होता है जो उपयोगकर्ता को सूचित करता है कि विशेष केक पांच बार से अधिक बिका है।

एक बार हमारा लूप चलने के बाद, हम "sold_more_than_five" डिक्शनरी को कंसोल पर प्रिंट करते हैं।

यह सुनिश्चित करने के लिए हमारा कोड चलाएं कि हमारा प्रोग्राम काम करता है:

Traceback (most recent call last):
File "main.py", line 16, in 
    sold_more_than_five[c] = c["sold"]
TypeError: unhashable type: 'dict'

हमारा कोड एक त्रुटि लौटाता है।

समाधान

हमारा कोड काम नहीं करता क्योंकि हम दूसरी डिक्शनरी का उपयोग करके डिक्शनरी कुंजी बनाने का प्रयास कर रहे हैं।

"c" का मान हमारी "cakes" सूची से एक डिक्शनरी के बराबर है। इसका अर्थ है कि जब हम "sold_more_than_five" डिक्शनरी में आइटम जोड़ने का प्रयास करते हैं, तो हम गलती से डिक्शनरी को कुंजी के रूप में जोड़ने का प्रयास कर रहे हैं:

sold_more_than_five[c] = c["sold"]

जब हमारा "if" स्टेटमेंट "Carrot Cake" केक पर चलता है, तो हमारा कोड चलाने का प्रयास करता है:

sold_more_than_five[{"name": "Carrot Cake", "sold": 7}] = 7

यह अमान्य है क्योंकि हम डिक्शनरी में कुंजी के रूप में डिक्शनरी जोड़ने का प्रयास कर रहे हैं। हम इस समस्या को c["name"] का उपयोग करके अपनी डिक्शनरी कुंजी के नाम के रूप में करके हल कर सकते हैं:

sold_more_than_five[c["name"]] = c["sold"]

इस संशोधित कोड के साथ अपना कोड चलाएं:

Carrot Cake has been sold more than five times.
Coconut and Lime Cake has been sold more than five times.
{'Carrot Cake': 7, 'Coconut and Lime Cake': 9}

हमारा कोड सफलतापूर्वक चलता है। अब हम प्रत्येक केक के नाम का उपयोग कुंजी के रूप में कर रहे हैं बजाय डिक्शनरी के।

निष्कर्ष

"TypeError: unhashable type: 'dict'" त्रुटि तब उठाई जाती है जब आप डिक्शनरी में ऐसा आइटम बनाने का प्रयास करते हैं जिसकी कुंजी अनहैशेबल ऑब्जेक्ट हो। केवल स्ट्रिंग्स, टपल्स, और इंटीजर्स जैसे इम्यूटेबल ऑब्जेक्ट्स का उपयोग डिक्शनरी में कुंजी के रूप में किया जा सकता है।

इस त्रुटि को हल करने के लिए, सुनिश्चित करें कि आप डिक्शनरी में आइटम बनाते समय केवल हैशेबल ऑब्जेक्ट्स का उपयोग करते हैं। अब आप इस सामान्य पायथन त्रुटि को एक पेशेवर डेवलपर की तरह हल करने के लिए तैयार हैं!

  1. - पायथन में डिक्शनरी डेटा टाइप

    पायथन के डिक्शनरी एक तरह के हैश टेबल टाइप हैं। वे असोसिएटिव ऐरे या पर्ल में पाए जाने वाले हैश की तरह काम करते हैं और key-value pairs से बने होते हैं। एक डिक्शनरी की key लगभग कोई भी पायथन टाइप हो सकती है, लेकिन आमतौर पर नंबर्स या स्ट्रिंग्स होती हैं। दूसरी ओर, values कोई भी मनमाना पायथन ऑब्जेक्ट हो

  1. - पायथन में डिक्शनरी मेथड्स

    पायथन में कुछ डिक्शनरी मेथड्स हैं जो नीचे दिए गए हैं:क्र.संमेथड नाम और विवरण1Python Dictionary clear()सभी आइटम्स क्लियर करें2Python Dictionary copy()डिक्शनरी की कॉपी3Python Dictionary fromkeys()दिए गए सीक्वेंस से डिक्शनरी बनाता है4Python Dictionary get()की की वैल्यू प्राप्त करें5Python Dictionary it

  1. - पायथन में TypeError एक्सेप्शन कैसे पकड़ें?

    TypeErrors गलत प्रकार के ऑब्जेक्ट्स को जोड़ने या गलत प्रकार के ऑब्जेक्ट के साथ फ़ंक्शन कॉल करने के कारण होते हैं। उदाहरण import sys try: ny = Statue of Liberty my_list = [3, 4, 5, 8, 9] print(my_list + ny) except TypeError as e: print(e) print(sys.exc_type) आउटपुट can only concat