লিস্ট ইনডেক্স নম্বর ব্যবহার করে ইনডেক্স করা হয়। এই নম্বরগুলো ইন্টিজার ভ্যালু। আপনি যদি ফ্লোটিং-পয়েন্ট নম্বর ব্যবহার করে লিস্ট থেকে একটি আইটেম অ্যাক্সেস করার চেষ্টা করেন, "TypeError: list indices must be integers or slices, not float" এরর আরাইজ হবে।
এই গাইডে, এই এরর কী বোঝায় এবং কেন আপনি এতে সম্মুখীন হতে পারেন তা আলোচনা করা হয়েছে। আমরা এই এররটির একটি উদাহরণ দিয়ে ওয়াকথ্রু করব যাতে আপনি কীভাবে ফিক্স করবেন তা শিখতে পারেন।
TypeError: list indices must be integers or slices, not float
যখন একটি আইটেম লিস্টে যোগ করা হয়, আইটেমটিকে একটি ইনডেক্স ভ্যালু অ্যাসাইন করা হয়। ইনডেক্স ভ্যালু শূন্য থেকে শুরু হয় এবং লিস্টে প্রতিটি নতুন আইটেমের জন্য এক করে বাড়ে। এটি পৃথক আইটেম অ্যাক্সেস করা সহজ করে তোলে। লিস্টের প্রথম আইটেমের ইনডেক্স ০, দ্বিতীয়টির ১, এবংكذا।
আপনি ফ্লোটিং-পয়েন্ট নম্বর ব্যবহার করে লিস্ট থেকে আইটেম রিট্রিভ করতে পারবেন না। ফ্লোটিং-পয়েন্ট নম্বর একটি ভিন্ন ডেটা টাইপ। ফলস্বরূপ, পাইথন সেগুলো আলাদাভাবে বιώνিয়ে। লিস্ট ইন্টিজার ইনডেক্স নম্বর এক্সপেক্ট করে কারণ লিস্ট ইন্টিজার ব্যবহার করে ইনডেক্স করা হয়।
একটি উদাহরণ সিনেরিও
আমরা একটি প্রোগ্রাম বানাব যা একটি টেনিস টুর্নামেন্টের পার্টিসিপেন্ট সম্পর্কে ইনফরমেশন রিট্রিভ করে। শুরুতে লিস্ট অফ লিস্ট ডিফাইন করি। এই লিস্ট অফ লিস্টে টুর্নামেন্টের সব পার্টিসিপেন্টের ইনফরমেশন থাকবে:
participants = [
["Alex Rogers", 5, 2],
["Linda Patterson", 3, 4],
["Ruby Spencer", 1, 6]
]
আমাদের পার্টিসিপেন্ট লিস্টে তিনটি লিস্ট রয়েছে। এই লিস্টগুলো প্রতিটি পার্টিসিপেন্টের নাম, তারা কত গেম জয় করেছেন, এবং কত গেম হারিয়েছে সেটি ক্রমে ধারণ করে।
ভ্যালুগুলো প্লেয়ারের জয়ের সংখ্যা অনুযায়ী অর্ডার করা হয়েছে।
এরপর, ইউজার থেকে pemainটি কে খুঁজতে চান সেটি জিজ্ঞেস করি। আমরা এটি input() স্টেটমেন্ট ব্যবহার করে করি:
player_to_find = float(input("Enter the leaderboard position of the player you want to find: "))
ইউজার যে নম্বর ইনসার্ট করবে সেটি লিডারবোর্ডে একজন প্লেয়ারের পজিশন এর সাথে কোরেসপন্ড করা উচিত। Alex Rogers প্রথম। তাঁর সম্পর্কে জানতে ইউজার ১ ইনসার্ট করবে।
ইউজার যে ভ্যালু ইনসার্ট করবে সেটি ফ্লোটে কনভার্ট করি কারণ আমরা পরে আমাদের কোডে ইনডেক্সিং ব্যবহার করব। ইনডেক্স ভ্যালু নিউমেরিক্যাল এবং তাই আমাদের সাথে কাজ করার জন্য একটি নম্বর প্রয়োজন।
এরপর, ইনডেক্সিং ব্যবহার করে ইউজার যেই প্লেয়ার খুঁজছেন সেটি রিট্রিভ করি:
player_info = participants[player_to_find - 1]
আমরা "player_to_find"-এর ভ্যালু ব্যবহার করি আমাদের "participants" লিস্ট থেকে একটি ইনডিভিজুয়াল প্লেয়ারের রেকর্ড খুঁজে বের করতে। আমরা "player_to_find"-এর ভ্যালু থেকে ১ বিয়োগ করি কারণ লিস্ট শূন্য থেকে ইনডেক্স করা হয় এবং লিডারবোর্ডে প্রথম ব্যক্তি পজিশন #1-এ থাকবে।
এরপর, এই পার্টিসিপেন্টের ডিটেইলস কনসোলে প্রিন্ট করি:
print("Name: {}".format(player_info[0]))
print("Wins: {}".format(player_info[1]))
print("Losses: {}".format(player_info[2]))
আমরা প্লেয়ারের নাম, কত গেম জয় করেছেন, এবং কত গেম হারিয়েছে সেটি কনসোলে ডিসপ্লে করি। আমাদের প্রোগ্রাম রান করি:
Enter the leaderboard position of the player you want to find: 2 Traceback (most recent call last): File "main.py", line 9, inplayer_info = participants[player_to_find + 1] TypeError: list indices must be integers or slices, not float
আমাদের প্রোগ্রামে লিডারবোর্ড পজিশন ইনসার্ট করার পর একটি এরর আরাইজ হয়।
সমাধান
আমরা ইউজার যে ভ্যালু আমাদের প্রোগ্রামে ইনসার্ট করবে সেটি ফ্লোটে কনভার্ট করি। আমরা এটি float() মেথড ব্যবহার করে করি।
এটি একটি ভুল কারণ যখন আমাদের "participants" লিস্ট থেকে আইটেম রিট্রিভ করার সময় আসে, আমরা ফ্লোটিং-পয়েন্ট নম্বর দিয়ে সেটি করার চেষ্টা করি। এর ফলে এরর হয়।
আমাদের প্রোগ্রাম ফিক্স করতে, আমাদের ইউজার যে ভ্যালু ইনসার্ট করবে সেটি ফ্লোটিং-পয়েন্ট নম্বর না করে ইন্টিজারে কনভার্ট করতে হবে। আমরা এটি int() মেথড ব্যবহার করে করতে পারি:
player_to_find = int(input("Enter the leaderboard position of the player you want to find: "))
এখন যেহেতু আমাদের একটি ইন্টিজার ভ্যালু আছে, আমরা ইনডেক্সিং ব্যবহার করে আমাদের লিস্ট থেকে আইটেম রিট্রিভ করতে পারি। আমাদের কোড রান করি এবং দেখি কী হয়:
Enter the number of the player you want to find: 2 Name: Linda Patterson Wins: 3 Losses: 4
আমাদের কোড সফলভাবে লিডারবোর্ডে পজিশন #2-এ থাকা ইনডিভিজুয়ালের প্লেয়ার রেকর্ড দেখাল।
উপসংহার
"TypeError: list indices must be integers or slices, not float" এরর তখন হয় যখন আপনি ফ্লোটিং-পয়েন্ট নম্বর ব্যবহার করে লিস্ট থেকে একটি আইটেম অ্যাক্সেস করার চেষ্টা করেন। এই এরর সমাধান করতে, নিশ্চিত করুন আপনি শুধু ইন্টিজার ব্যবহার করছেন লিস্টে আইটেম তাদের ইনডেক্স ভ্যালু দিয়ে অ্যাক্সেস করতে।
এখন আপনি এই এরর আপনার কোডে প্রো মত ফিক্স করার জন্য প্রস্তুত!