آموزش

آموزش متد ()index. در لیست‌های پایتون با مثال

اینجا یاد می‌گیری چطور از متد ()index. در پایتون استفاده کنی تا موقعیت عناصر رو در لیست‌ها پیدا کنی.

تاریخ انتشار:
15 شهریور 1405
پایتون
6 دقیقه
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

در پایتون، ساختار داده بهت کمک می‌کنه تا داده‌ها رو خیلی بهتر و بهینه‌تر سازماندهی و ذخیره کنی. یکی از این ساختارهای رایج و پرکاربرد، لیسته که می‌تونه انواع مختلف داده‌ها رو با یه ترتیب خاص نگه داره. پایتون توابع و متدهای زیادی رو هم برای کار با لیست‌ها داره.

در این آموزش، با متد index() در پایتون آشنا می‌شی. کار این متد اینه که یه عنصر رو در لیست جستجو می‌کنه و موقعیت یا همون اندیسش رو برمی‌گردونه. اول یه کم با خود لیست‌ها آشنا می‌شیم و بعد چند تا مثال ساده از نحوه کار با متد index() رو می‌بینیم.

اندیس‌گذاری در پایتون چیه؟

در پایتون، به فرآیند دسترسی به یه عنصر خاص در یک دنباله (مثل رشته یا لیست) با استفاده از موقعیت یا شماره اندیسش، اندیس‌گذاری می‌گن. اندیس‌گذاری در پایتون از 0 شروع می‌شه، یعنی اولین عنصر یه دنباله اندیس 0 داره، دومی اندیس 1 داره و به همین ترتیب. مثلاً، اگه رشته "Hello" رو داشته باشیم، می‌تونیم با براکت یعنی string[0] از طریق اندیس 0 به اولین حرفش که "H" هست دسترسی پیدا کنیم.

متد index() در پایتون یه ابزار خیلی به درد بخور برای پیدا کردن اندیس یه عنصر خاص در یک دنباله‌ست. این متد یه آرگومان (همون مقداری که باید جستجو بشه) می‌گیره و اندیس اولین جایی که اون مقدار رو در دنباله پیدا می‌کنه، برمی‌گردونه.

اگه اون مقدار در دنباله پیدا نشه، تابع ارور ValueError می‌ده. مثلاً، اگه یه لیست به شکل [1, 2, 3, 4, 5] داشته باشیم، می‌تونیم با فراخوانی list.index(3) اندیس مقدار 3 رو پیدا کنیم که خروجی 2 رو بهمون می‌ده (چون 3 سومین عنصر لیسته و اندیس‌گذاری هم از 0 شروع می‌شه).

متد index() ابزار قدرتمندیه چون فرآیند پیدا کردن اندیس یه عنصر رو ساده می‌کنه و دیگه نیازی نیست حلقه‌ یا دستورات شرطی بنویسیم. این تابع مخصوصاً وقت‌هایی که با دیتاست‌های بزرگ یا ساختارهای پیچیده کار می‌کنی خیلی به کارت میاد؛ چون در اینجور مواقع، جستجوی دستی هم وقت‌گیره و هم احتمال خطا در اون بالاست.

متد ()index چیه؟

متد index() کوچک‌ترین اندیسی رو برمی‌گردونه که عنصر مورد نظرت در اون پیدا شده.

بیا با هم امتحانش کنیم:

اگه دنبال عنصری بگردی که در لیست وجود نداره، خطای ValueError می‌گیری.

خروجی
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 3 is not in list

کار با رشته‌ها

بیا این متد رو روی عناصر رشته‌ای هم تست کنیم:

خروجی
1

نکته: موقع جستجوی رشته‌ها، متد index() به حروف بزرگ و کوچک حساسه (Case-sensitive). مثلاً عبارت 'Hello'.index('h') خطای ValueError می‌ده.

پیدا کردن اولین مورد

فرض کن از یه عنصر چند تا نمونه در لیست داری؛ در این حالت index() اولین موقعیتی که اون عنصر در لیست هست رو بهت برمی‌گردونه.

خروجی
0

موقعیتی که برمی‌گردونه صفره، چون عدد ۳ اولین بار در همون جایگاه اول (یعنی اندیس صفر در پایتون) قرار داره.

پشت صحنه این اتفاق می‌افته: جستجو از همون موقعیت اول (اندیس صفر) شروع می‌شه و متد دونه‌دونه مقادیر رو چک می‌کنه تا به عنصری که دنبالش می‌گردی برسه. وقتی مقدار رو پیدا کرد، موقعیتش رو برمی‌گردونه و جستجو تموم می‌شه. اما اگه لیستت خیلی بزرگ باشه و عنصری که می‌خوای نزدیکای آخر لیست باشه، این روش خیلی بهینه نیست.

استفاده از پارامترهای start و stop

خروجی
6

ساختار کلیش به این صورته:

اینجا مقادیر start و stop اختیاری هستن. راستش رو بخوای، فقط زمانی باید ازشون استفاده کنی که از محدوده جستجوت کاملاً مطمئنی؛ وگرنه همون‌طور که در مثال پایین می‌بینی، خطای ValueError می‌گیری.

خروجی
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 7 is not in list

پیدا کردن همه موارد

از اونجا که متد index() فقط اولین مورد پیدا شده از یه شیء رو برمی‌گردونه، اگه بخوای بقیه موقعیت‌های اون عنصر رو در لیست پیدا کنی، می‌تونی از لیست کامپرهنشن (list comprehension) یا عبارت مولد (generator expression) کمک بگیری. روش کار به این صورته:

خروجی
[0, 3, 4, 8]
خروجی
Generators store values, the first value here is: 0. Then the next is: 3 followed by  4 and finally  8

روش عبارت مولد از نظر مصرف حافظه عالیه، چون به جای اینکه مثل لیست کامپرهنشن همه نتایج رو یک‌جا ذخیره کنه، آیتم‌ها رو یکی‌یکی پردازش می‌کنه.

حرف آخر

تبریک! تو الان با متد index() در پایتون آشنا شدی و دیدی که چطور می‌تونه در کار با لیست‌ها کمکت کنه. در کنارش با چند تا مفهوم جدید هم آشنا شدی. برای اینکه بیشتر درباره عبارت‌های مولد بدونی، یه سر به آموزش پیمایشگرها در پایتون فینکا بزن.

اشتراک‌گذاری
فهرست مطالب
  • اندیس‌گذاری در پایتون چیه؟
  • متد ()index چیه؟
  • کار با رشته‌ها
  • پیدا کردن اولین مورد
  • استفاده از پارامترهای start و stop
  • پیدا کردن همه موارد
  • حرف آخر

سوالات متداول

متد index() فقط اندیس اولین موردی که پیدا می‌کنه رو برمی‌گردونه. اگه به همه موقعیت‌ها نیاز داری، از لیست کامپرهنشن به همراه enumerate() استفاده کن.

بله! متد index() روی هر نوع داده‌ای از نوع دنباله، از جمله تاپل‌ها و رشته‌ها کار می‌کنه:

my_tuple = (1, 2, 3, 2)
print(my_tuple.index(2))  # Output: 1

text = "hello world"
print(text.index('o'))    # Output: 4

بله، می‌تونی فراخوانی index() رو داخل بلوک try-except قرار بدی تا اگه عنصر پیدا نشد، برنامه یهو متوقف نشه:

my_list = [1, 2, 3]
try:
    print(my_list.index(4))
except ValueError:
    print("Element not found.")

متد index() از جستجوی معکوس پشتیبانی نمی‌کنه. برای پیدا کردن آخرین مورد، باید لیست رو دستی معکوس کنی یا از لیست کامپرهنشن استفاده کنی:

my_list = [1, 2, 3, 2, 1]
last_index = len(my_list) - 1 - my_list[::-1].index(2)
print(last_index)  # Output: 3

متد find() در رشته‌ها استفاده می‌شه و اگه مقداری پیدا نشه، به جای ارور دادن، مقدار 1- رو برمی‌گردونه. لیست‌ها اصلاً متد find() ندارن.

text = "hello"
print(text.find('e'))  # Output: 1
print(text.find('z'))  # Output: -1

بله، اما فقط در سطح اول. متد index() داخل ساختارهای تو در تو جستجو نمی‌کنه.

nested_list = [[1, 2], [3, 4]]
print(nested_list.index([3, 4]))  # Output: 1
# This won't work: nested_list.index(3)

خطای list index out of range زمانی رخ می‌ده که بخوای به اندیسی دسترسی پیدا کنی که خارج از محدوده اندیس‌های معتبر لیستته. مثلاً، اگه یه لیست ۵ تا عنصر داشته باشه، اندیس‌های معتبرش می‌شن ۰ تا ۴. حالا اگه بخوای به اندیسی مساوی یا بزرگ‌تر از ۵ دسترسی پیدا کنی، این ارور رو می‌گیری.

برای جلوگیری از این خطا، باید مطمئن بشی اندیسی که می‌خوای بهش دسترسی پیدا کنی در محدوده معتبر لیست قرار داره. می‌تونی از تابع len() کمک بگیری تا طول لیست رو به دست بیاری و چک کنی که اندیست معتبر هست یا نه.

خطای list indices must be integers زمانی رخ می‌ده که سعی کنی از یه مقدار غیرصحیح به عنوان اندیس لیست استفاده کنی. مثلاً اگه یه عدد اعشاری یا یه رشته رو به عنوان اندیس بدی، این ارور رو می‌گیری.

برای جلوگیری از این خطا، باید مطمئن بشی که حتماً از یه عدد صحیح به عنوان اندیس استفاده می‌کنی. وقتی نیاز داری از یه مقدار غیرصحیح استفاده کنی، می‌تونی با تابع int() اون رو به عدد صحیح تبدیل کنی.

دریافت اپلیکیشن فینکا

با اپلیکیشن فینکا، به بیشتر دوره‌ها و مسیرها روی موبایل دسترسی دارید، تمرین می‌کنید و یادگیری رو هم‌زمان روی موبایل و دسکتاپ ادامه می‌دید.