কম্পিউটার টিউটোরিয়াল

পাইথন TypeError: unhashable type: 'slice' সমাধান

পাইথন ডিকশনারির মানগুলোকে লিস্টের মতো স্লাইস (slice) করা যায় না। এর কারণ হল ডিকশনারিতে কাস্টম কী (key) মান থাকতে পারে। এগুলো শূন্য থেকে সূচকबদ্ধ (indexed) নয়। আপনি যদি একটি ডিকশনারিকে লিস্টের মতো স্লাইস করার চেষ্টা করেন, তবে আপনি "TypeError: unhashable type: 'slice'" এররটির সম্মুখীন হবেন।

এই গাইডটি এই এররটির অর্থ এবং কেন এটি আপনার কোডে দেখা যায় সেটি আলোচনা করে। এটি এই এররটির একটি উদাহরণ দিয়ে আপনাকে সমাধান বুঝাতে সাহায্য করে।

TypeError: unhashable type: 'slice'

একটি স্লাইস (slice) হলো একটি সিকোয়েন্স (sequence) যেমন স্ট্রিং, লিস্ট, বা টাপলের একটি উপসেট (subset)। নামটিই স্লাইসের উদ্দেশ্য বোঝায়: এটি একটি সিকোয়েন্সের "একটি স্লাইস"।

নিচের প্রোগ্রামটি বিবেচনা করুন:

news_sites = ["New York Times", "Washington Post", "CNN"]
print(news_sites[:2])

এই কোডটি আমাদের "news_sites" লিস্টের প্রথম দুটি মান বের করে এবং কনসোলে প্রিন্ট করে। আমাদের কোড ফেরত দেয়: ['New York Times', 'Washington Post']।

এটি স্লাইসিং (slicing) এর একটি উদাহরণ। আপনি লিস্ট থেকে দুটি অবজেক্ট বের করছেন। একটি কোলন (:) এবং একটি সূচক মান নির্দিষ্ট করে, আপনি পাইথনকে বলছেন কোন অবজেক্টগুলো বের করতে হবে।

ডিকশনারিকে লিস্টের মতো স্লাইস করা যায় না। ডিকশনারিতে কোনো সূচক নম্বর নেই এবং তাই এই সিনট্যাক্সটি প্রযোজ্য নয়।

TypeError: unhashable type: 'slice'

এক কম্পিউটার হার্ডওয়ার স্টোরে বিক্রয়ের জন্য একটি কীবোর্ড (keyboard) সম্পর্কে তথ্য প্রদর্শন করার একটি প্রোগ্রাম তৈরি করুন। শুরুতে একটি কীবোর্ড সম্পর্কে ডেটা সহ একটি ডিকশনারি সংজ্ঞায়িত করুন:

keyboard = {
    "name": "Huntsman Mini",
    "brand": "Razer",
    "price": 119.99,
    "switch_type": "Razer Switches",
}

প্রোগ্রামটি একটি কীবোর্ডের নাম, এর দাম, কীবোর্ডের ব্র্যান্ড, এবং কীবোর্ডটি ব্যবহার করা সুইচের ধরন (switch type) সম্পর্কে তথ্য সংরক্ষণ করে। আপনি শুধু দেখাতে চান: কীবোর্ডের নাম, কীবোর্ডের ব্র্যান্ড, এবং এর দাম।

এটি করার জন্য, আমাদের ডিকশনারির প্রথম তিনটি আইটেম বের করতে স্লাইসিং ব্যবহার করুন। এই আইটেমগুলো হলো কীবোর্ডের নাম, ব্র্যান্ড, এবং দাম:

show_to_customer = keyboard[:3]

এই কোডটি ডিকশনারির প্রথম তিনটি আইটেম বের করে। এরপর, এই লিস্টের ওপর পুনরাবৃত্তি করতে একটি for লুপ ব্যবহার করুন এবং প্রতিটি আইটেম কনসোলে প্রিন্ট করুন:

for s in show_to_customer:
    print(s[1])

আপনি "show_to_customer" ভেরিয়েবলের প্রতিটি রেকর্ড থেকে মান বের করতে সূচকরণ (indexing) ব্যবহার করেন। তারপর একটি print() স্টেটমেন্ট ব্যবহার করে সেই মানটি কনসোলে প্রিন্ট করেন।

কোডটি রান করুন এবং দেখুন কী হয়:

Traceback (most recent call last):
  File "main.py", line 8, in 
    show_to_customer = keyboard[:3]
TypeError: unhashable type: 'slice'

আমাদের কোডটি একটি এরর ফেরত দিচ্ছে।

সমাধান

লিস্টের বিপরীতে, ডিকশনারিকে স্লাইস করা যায় না। আপনি স্লাইসিং ব্যবহার করে ডিকশনারি থেকে কোনো আইটেম বের করতে পারবেন না কারণ ডিকশনারিতে সূচক নম্বর নেই। ডেটা কী-ভ্যালু (key-value) জোড়া হিসেবে সংরক্ষিত থাকে। কারণ ডিকশনারিকে স্লাইস করা যায় না, আগের for লুপ উপযুক্ত নয়।

আপনাকে সরাসরি নির্দিষ্ট করতে হবে আপনি ডিকশনারি থেকে কোন মানগুলো অ্যাক্সেস করতে চান। এটি করার জন্য, ডিকশনারিতে উপযুক্ত কী (key) নামগুলো রেফার করুন।

কোডটি সমাধান করতে, আপনি কনসোলে প্রদর্শন করতে চান এমন প্রতিটি মানকে আলাদা করে অ্যাক্সেস করুন:

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" এর মান কনসোলে প্রিন্ট করে।

আপনি "price" মানকে str() মেথড ব্যবহার করে স্ট্রিং-এ রূপান্তর করেন যাতে এটি কনক্যাটেনেশন অপারেটর (+) ব্যবহার করে "Price: $" লেবেলের সাথে যুক্ত হয়।

আমাদের নতুন প্রোগ্রামটি রান করুন:

Name: Huntsman Mini
Brand: Razer
Price: $119.99

কোডটি সফলভাবে আপনি কনসোলে প্রদর্শন করতে চেয়ে ছিলে তিনটি তথ্যটি প্রিন্ট করে। ব্যবহারকারী কীবোর্ডের নাম, ব্র্যান্ড, এবং দাম দেখতে পান।

উপসংহার

"TypeError: unhashable type: 'slice'" এররটি তখন উঠে যখন আপনি স্লাইসিং সিনট্যাক্স ব্যবহার করে ডিকশনারি থেকে আইটেম অ্যাক্সেস করার চেষ্টা করেন। এই এররটি সমাধান করতে, নিশ্চিত করুন যে আপনি ডিকশনারি থেকে যে আইটেমগুলো অ্যাক্সেস করতে চান সেগুলোকে সরাসরি রেফার করছেন।

এখন আপনার কাছে এই এররটি একজন এক্সপার্টের মতো সমাধান করার জ্ঞান আছে!

  1. পাইথনে ফাংশন নাম পাওয়ার উপায়

  2. পাইথনে টাপল ডেটা টাইপ (Tuple Data Type in Python)

  3. পাইথনে স্ট্রিং ডেটা টাইপ (String Data Type in Python)

  4. পাইথনে TypeError এক্সসেপশন ক্যাচ করা