TypeError: unhashable type: 'list'
पायथन डिक्शनरी केवल हैशेबल डेटा टाइप्स को डिक्शनरी में की के रूप में स्वीकार करती है। लिस्ट हैशेबल डेटा टाइप नहीं है। यदि आप डिक्शनरी में लिस्ट को की के रूप में निर्दिष्ट करते हैं, तो आपको "TypeError: unhashable type: 'list'" एरर मिलेगी।
इस गाइड में, हम बात करते हैं कि इस एरर का क्या मतलब है और आप इसे अपने कोड में क्यों देखते हैं। हम इस एरर के एक उदाहरण के माध्यम से चलेंगे ताकि आपको दिखा सकें कि इसे कैसे हल किया जाए।
उदाहरण परिदृश्य
आइए एक प्रोग्राम बनाते हैं जो उन छात्रों की लिस्ट बनाता है जिनका औसत ग्रेड 75 से अधिक है। यह लिस्ट प्रत्येक छात्र और उनके ग्रेड के डिक्शनरी रिकॉर्ड्स को समाहित करेगी। इस डिक्शनरी को बनाने के लिए, हम स्कूल के सभी छात्रों और उनके ग्रेड की लिस्ट वाली डिक्शनरी से काम करेंगे।
छात्रों की लिस्ट और हमारे टॉप छात्रों के लिए डिक्शनरी परिभाषित करके शुरू करें:
students = [
{ "name": "Linda", "grades": [84, 82, 65] },
{ "name": "Alex", "grades": [67, 68, 83] },
{ "name": "Holly", "grades": [72, 74, 81] }
]
top_students = {}
"students" लिस्ट में प्रत्येक मान एक डिक्शनरी है। प्रत्येक डिक्शनरी में दो कीज़ हैं: name और grades। हमने "top_students" नामक डिक्शनरी परिभाषित की है जिसमें हमारे टॉप छात्रों के बारे में जानकारी होगी।
अब जब हमने इस डिक्शनरी को परिभाषित कर लिया है, हम फोर लूप का उपयोग करके उन छात्रों को फ़िल्टर करते हैं जिनके औसत ग्रेड 75 से अधिक हैं और उन्हें अपनी नई डिक्शनरी में जोड़ते हैं:
for s in students:
average = sum(s["grades"]) / len(s["grades"])
if average > 75:
top_students[s["grades"]] = s["name"]
फोर लूप के प्रत्येक इटरेशन में, हम छात्र द्वारा अर्जित सभी ग्रेड का औसत गणना करते हैं। हम ऐसा सभी ग्रेड के कुल को कितने ग्रेड रिकॉर्ड किए गए हैं, उससे विभाजित करके करते हैं।
अगला, हम चेक करते हैं कि क्या वह औसत 75 से अधिक है। यदि यह है, तो हम छात्र के नाम और उनके ग्रेड के साथ top_students डिक्शनरी में नई एंट्री बनाते हैं।
अंत में, हम top_students डिक्शनरी को कंसोल पर प्रिंट करते हैं ताकि हम उन सभी छात्रों को देख सकें जिनका औसत ग्रेड 75 से अधिक है:
print(top_students)
हमारा कोड चलाएं और देखें क्या होता है:
Traceback (most recent call last): File "main.py", line 11, intop_students[s["grades"]] = s["name"] TypeError: unhashable type: 'list'
हमारा कोड सफलतापूर्वक एक्जीक्यूट होने में विफल रहता है।
समाधान
हमारा कोड तब तक काम करता है जब तक इंटरप्रेटर लाइन 11 तक नहीं पहुंच जाता। इस लाइन पर, हमारा कोड कहता है:
top_students[s["grades"]] = s["name"]
हमारे कोड में एरर है क्योंकि हमने डिक्शनरी में लिस्ट को की के रूप में असाइन करने का प्रयास किया है। जब हमारा कोड हमारे लूप के पहले इटरेशन पर इस लाइन को पार्स करता है, तो हमारा कोड निम्न की और मान के साथ डिक्शनरी बनाने का प्रयास करता है:
{ [84, 82, 65]: "Linda" }
यह एक अमान्य डिक्शनरी है। हमारा कोड लिस्ट को की के रूप में असाइन करने का प्रयास करता है जो काम नहीं करता।
इस समस्या को हल करने के लिए, हम डिक्शनरी में ग्रेड की लिस्ट के बजाय छात्र के नाम को की के रूप में उपयोग करते हैं:
top_students[s["name"]] = s["grades"]
हमने ग्रेड की लिस्ट को की के बजाय मान के रूप में असाइन किया है। छात्र का नाम डिक्शनरी में की है। आइए अपना कोड चलाएं:
{'Linda': [84, 82, 65], 'Holly': [72, 74, 81]}
हमारा कोड सफलतापूर्वक टॉप-परफॉर्मिंग छात्रों के बारे में जानकारी वाली डिक्शनरी बनाता है। किसी भी छात्र जिसका पिछले तीन टेस्ट पर औसत ग्रेड 75 से अधिक है, डिक्शनरी में जोड़ा गया था।
हमारा डिक्शनरी इस प्रकार टूटता है:
- कीज़: Linda, Holly
- मान: [84, 82, 65], [72, 74, 81]
क्योंकि हम अब अपने की नामों को स्ट्रिंग्स असाइन कर रहे हैं, हमारा कोड काम करता है।
निष्कर्ष
"TypeError: unhashable type: 'list'" एरर तब उठाई जाती है जब आप डिक्शनरी में लिस्ट को की के रूप में असाइन करने का प्रयास करते हैं। इस एरर को हल करने के लिए, सुनिश्चित करें कि आप केवल हैशेबल ऑब्जेक्ट, जैसे स्ट्रिंग या टुपल, को डिक्शनरी के लिए की के रूप में असाइन करते हैं।
अब आप इस एरर को एक प्रोफेशनल कोडर की तरह हल करने के लिए तैयार हैं!