পাইথন ভাষা একটি ডিকশনারিতে কী হিসেবে কী ব্যবহার করা যাবে সেটি নিয়ে খুব স্পেসিফিক। একটি পাইথন ডিকশনারিতে, সব কী হ্যাশেবল হতে হবে।
যদি আপনি একটি ডিকশনারিতে একটি কী অ্যাড করার সময় একটি আনহ্যাশেবল কী টাইপ ব্যবহার করার চেষ্টা করেন, আপনি "TypeError: unhashable type: 'dict'" এররটি এনকাউন্টার করবেন।
এই গাইডে, আমরা এই এরর কী বোঝায় এবং কেন এটি উঠে সেটি আলোচনা করব। আমরা এই এররটি একটি উদাহরণের মাধ্যমে যাব যাতে আপনি আপনার কোডে কীভাবে এটি সমাধান করবেন সেটি শিখতে পারেন।
TypeError: unhashable type: 'dict'
ডিকশনারি দুটি অংশ থেকে বने: কী এবং ভ্যালু। কী হল সেসব আইডেন্টিফায়ার যেগুলো একটি ভ্যালুর সাথে বাউন্ড থাকে। যখন আপনি একটি কী রেফারেন্স করেন, আপনি সেই কীর সাথে asoshiated ভ্যালু রিট্রিভ করতে পারবেন।
শুধু হ্যাশেবল অবজেক্টগুলো একটি ডিকশনারিতে কী হতে পারে। ইমিউটেবল অবজেক্ট যেমন স্ট্রিং, ইন্টিজার, টাপল, এবং frozenset হ্যাশেবল, কিছু এক্সেপশন সহ। ডিকশনারি, তাই, একটি ডিকশনারিতে কী হিসেবে ব্যবহার করা যায় না।
একটি ডিকশনারিতে একটি আইটেম অ্যাড করতে, আপনাকে একটি বৈধ হ্যাশেবল কী স্পেসিফাই করতে হবে। উদাহরণস্বরূপ, "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" এর ভ্যালু ৫-এর চেয়ে বেশি কিনা সেটি কমপেয়ার করি। যদি হয়, সেই আইটেমটি আমাদের "sold_more_than_five" ডিকশনারিতে অ্যাড হয়। তারপর, একটি মেসেজ কনসোলে প্রিন্ট হয় ইউজারকে জানিয়ে যে সেটি নির্দিষ্ট কেকটি পাঁচবার এর অধিক বিক্রি হয়েছে।
একবার আমাদের লুপ রান হয়ে গেলে, আমরা "sold_more_than_five" ডিকশনারি কনসোলে প্রিন্ট করি।
আমাদের কোড রান করি নিশ্চিত করতে আমাদের প্রোগ্রাম কাজ করছে কিনা:
Traceback (most recent call last): File "main.py", line 16, insold_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'" এররটি উঠে যখন আপনি একটি ডিকশনারিতে এমন একটি আইটেম তৈরি করার চেষ্টা করেন যার কী একটি আনহ্যাশেবল অবজেক্ট। শুধু ইমিউটেবল অবজেক্ট seperti স্ট্রিং, টাপল, এবং ইন্টিজার একটি ডিকশনারিতে কী হিসেবে ব্যবহার করা যায়।
এই এররটি সমাধান করতে, নিশ্চিত করুন যে আপনি একটি ডিকশনারিতে আইটেম তৈরি করার সময় শুধু হ্যাশেবল অবজেক্ট ব্যবহার করছেন। এখন আপনি এই সাধারণ পাইথন এররটি প্রফেশনাল ডেভেলপারের মতো সমাধান করার জন্য রেডি!