পাইথন ডিকশনারি শুধুমাত্র হ্যাশেবল (hashable) ডেটা টাইপগুলোকে একটি ডিকশনারিতে কী (key) হিসেবে গ্রহণ করে। একটি লিস্ট হ্যাশেবল ডেটা টাইপ নয়। আপনি যদি একটি লিস্টকে একটি ডিকশনারিতে কী হিসেবে নির্দিষ্ট করেন, তবে আপনি "TypeError: unhashable type: 'list'" এররটির সম্মুখীন হবেন।
এই গাইডে, আমরা এই এররটির অর্থ এবং কেন এটি আপনার কোডে দেখা যায় সেটি আলোচনা করব। আমরা আপনাকে এই এররটি কীভাবে সমাধান করতে হয় সেটি দেখাতে এই এররটির একটি উদাহরণের মাধ্যমে যাব।
TypeError: unhashable type: 'list'
ডিকশনারির দুটি অংশ থাকে: কী (keys) এবং ভ্যালু (values)। কীগুলো একটি নির্দিষ্ট ভ্যালুর সাথে যুক্ত লেবেল। একটি ভ্যালু অ্যাক্সেস করতে, আপনাকে অবশ্যই সেই ভ্যালুর কী নামটি রেফারেন্স করতে হবে।
যদিও ভ্যালুগুলো যেকোনো ডেটা টাইপের হতে পারে, লিস্ট থেকে স্ট্রিং পর্যন্ত, শুধুমাত্র হ্যাশেবল অবজেক্টগুলো কী হিসেবে গ্রহণযোগ্য। হ্যাশেবল অবজেক্টগুলো হলো যেসব অবজেক্ট जिनका হ্যাশ ভ্যালু সময়ের সাথে সাথে পরিবর্তন হয় না। হ্যাশেবল অবজেক্টের উদাহরণ হলো টাপল (tuples) এবং স্ট্রিং (strings)।
লিস্টগুলোর একটি অপরিবর্তনশীল হ্যাশ ভ্যালু নেই। তাদের হ্যাশ ভ্যালুগুলো সময়ের সাথে সাথে পরিবর্তন হতে পারে। এর মানে আপনি একটি লিস্টকে ডিকশনারি কী হিসেবে নির্দিষ্ট করতে পারবেন না।
একটি উদাহরণ পরিস্থিতি
চলুন একটি প্রোগ্রাম তৈরি করি যেগুলোর গড় গ্রেড ৭৫-এর বেশি এমন ছাত্রদের একটি লিস্ট তৈরি করে। এই লিস্টে প্রতিটি ছাত্র এবং তাদের গ্রেডের ডিকশনারি রেকর্ড থাকবে। এই ডিকশনারি তৈরি করতে, আমরা একটি স্কুলের সকল ছাত্র এবং তাদের গ্রেডের একটি ডিকশনারি থেকে কাজ করব।
শুরুতে, ছাত্রদের একটি লিস্ট এবং আমাদের টপ ছাত্রদের জন্য একটি ডিকশনারি সংজ্ঞায়িত করুন:
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" নামে একটি ডিকশনারি সংজ্ঞায়িত করেছি যেটি আমাদের টপ ছাত্রদের তথ্য ধারণ করবে।
এখন যেহেতু আমরা এই ডিকশনারিটি সংজ্ঞায়িত করেছি, আমরা একটি for লুপ ব্যবহার করি যেসব ছাত্রদের গড় গ্রেড ৭৫-এর বেশি সেগুলো ফিল্টার আউট করব এবং তাদের আমাদের নতুন ডিকশনারিতে যোগ করব:
for s in students:
average = sum(s["grades"]) / len(s["grades"])
if average > 75:
top_students[s["grades"]] = s["name"]
for লুপের প্রতিটি ইটারেশনে, আমরা একজন ছাত্রের অর্জন করা সকল গ্রেডের গড় গণনা করি। আমরা এটি করি সকল গ্রেডের মোটকে কতগুলো গ্রেড রেকর্ড করা হয়েছে সেটি দিয়ে ভাগ করে।
এরপর, আমরা চেক করি যে গড়টি ৭৫-এর বেশি কিনা। যদি হয়, তবে আমরা top_students ডিকশনারিতে একটি নতুন এন্ট্রি তৈরি করি ছাত্রের নাম এবং তাদের গ্রেডের সাথে।
অবশেষে, আমরা top_students ডিকশনারিটি কনসোলে প্রিন্ট করি যাতে আমরা ৭৫-এর বেশি গড় গ্রেড পাওয়া সকল ছাত্রকে দেখতে পাই:
print(top_students)
আমাদের কোডটি রান করুন এবং ফলাফল দেখুন:
Traceback (most recent call last): File "main.py", line 11, intop_students[s["grades"]] = s["name"] TypeError: unhashable type: 'list'
আমাদের কোড সফলভাবে এক্সিকিউট হতে ব্যর্থ হয়েছে।
সমাধান
আমাদের কোড লাইন ১১ পর্যন্ত কাজ করে। এই লাইনে, আমাদের কোড বলে:
top_students[s["grades"]] = s["name"]
আমাদের কোডের এররটি হলো আমরা একটি লিস্টকে ডিকশনারিতে কী হিসেবে অ্যাসাইন করার চেষ্টা করেছি। যখন আমাদের কোড আমাদের লুপের প্রথম ইটারেশনে এই লাইনটি পার্স করে, আমাদের কোড নিচের কী এবং ভ্যালু সহ একটি ডিকশনারি তৈরি করার চেষ্টা করে:
{ [84, 82, 65]: "Linda" }
এটি একটি অবৈধ ডিকশনারি। আমাদের কোড একটি লিস্টকে কী হিসেবে অ্যাসাইন করার চেষ্টা করে যা কাজ করে না।
এই সমস্যাটি সমাধান করতে, আমরা ডিকশনারিতে কী হিসেবে ছাত্রের নাম ব্যবহার করি গ্রেডের লিস্টের বদলে:
top_students[s["name"]] = s["grades"]
আমরা গ্রেডের লিস্টকে একটি ভ্যালু হিসেবে অ্যাসাইন করেছি কী হিসেবে না। ছাত্রের নাম ডিকশনারিতে কী। আমাদের কোডটি রান করুন:
{'Linda': [84, 82, 65], 'Holly': [72, 74, 81]}
আমাদের কোডটি সফলভাবে টপ-পারফর্মিং ছাত্রদের তথ্য সহ একটি ডিকশনারি তৈরি করেছে। যেকোনো ছাত্র যার শেষ তিনটি টেস্টে গড় গ্রেড ৭৫-এর বেশি সে ডিকশনারিতে যোগ করা হয়েছে।
আমাদের ডিকশনারি নিচের মতো ব্রেক ডাউন হয়:
- Keys: Linda, Holly
- Values: [84, 82, 65], [72, 74, 81]
কারণ আমরা এখন আমাদের কী নামগুলোর জন্য স্ট্রিং অ্যাসাইন করছি, আমাদের কোডটি কাজ করছে।
উপসংহার
"TypeError: unhashable type: 'list'" এররটি তখন উঠে যখন আপনি একটি লিস্টকে ডিকশনারিতে কী হিসেবে অ্যাসাইন করার চেষ্টা করেন। এই এররটি সমাধান করতে, নিশ্চিত করুন যে আপনি শুধুমাত্র একটি হ্যাশেবল অবজেক্ট, যেমন একটি স্ট্রিং বা একটি টাপল, ডিকশনারির কী হিসেবে অ্যাসাইন করছেন।
এখন আপনি এই এররটি একজন প্রফেশনাল কোডারের মতো সমাধান করতে পারেন!