سرفصل‌های آموزشی
آموزش پایتون
آشنایی با نحو‌ه‌ی دسترسی به محتوای لیست در زبان برنامه‌نویسی پایتون

آشنایی با نحو‌ه‌ی دسترسی به محتوای لیست در زبان برنامه‌نویسی پایتون

در آموزش گذشته با نحوۀ تعریف و ایجاد آبجکت‌هایی از نوع لیست در زبان پایتون آشنا شدیم و گفتیم که هدف از ایجاد آبجکت‌هایی از جنس لیست دسترسی و مدیریت آسان اطلاعات درون آن‌ها می‌باشد که در همین راستا نیاز است تا به نحوی به اعضای درون یک لیست دسترسی پیدا کنیم. برای مثال، جهت نمایش محتوای داخل یک لیست می‌توانیم از فانکشن ()print استفاده کنیم به طوری که داریم:

>>> listA = [1, 2, 3, 4, 5]
>>> print(listA)
[1, 2, 3, 4, 5]

(برای آموزش ویدیویی پایتون اینجا کلیک کنید)

در کد فوق متغیری از جنس لیست تحت عنوان listA تعریف کرده و هر یک از اعداد فوق را به آن اختصاص داده‌ایم و در ادامه فانکشن ()print را فراخوانی کرده و آرگومان ورودی listA را به آن داده‌ایم که در نهایت محتوای داخل لیست در خروجی چاپ می‌شود اما معمولاً این سطح از دسترسی به محتوای یک لیست برای دولوپرها مطلوب نیست که در همین راستا قصد داریم تا در ادامه نحوۀ دسترسی به تک‌تک اعضای درون لیست را مورد بررسی قرار دهیم که برای این منظور کافی است تا بدین صورت عمل کنیم:

>>> print(listA[0])
1

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

نکته توجه داشته باشیم که در اکثر زبان‌های برنامه‌نویسی از جمله پایتون شمارش لیست‌ها، آرایه‌ها و سایر آبجکت‌هایی از این دست از عدد 0 آغاز می‌شود.

به همین ترتیب می‌توانیم به تمامی اعضای لیست با استفاده از اندیس‌های آن‌ها به صورت جداگانه دسترسی پیدا کنیم که برای این منظور داریم:

>>> listA[1]
2
>>> listA[2]
3
>>> listA[3]
4
>>> listA[4]
5

در مثال فوق آبجکت listA دارای پنج عضو است و از همین روی اندیس‌های اختصاص‌یافته به اعضای آن در بازۀ 0 تا 4 قرار می‌گیرند که در چنین شرایطی اگر از مفسر پایتون بخواهیم عضوی با اندیس بالاتر از 4 را در معرض دیدمان قرار دهد با خطای زیر مواجه خواهیم شد:

>>> listA[5]
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in 
    listA[5]
IndexError: list index out of range

در واقع، خط آخر از خطای مذکور بدین معنی است که اندیس استفاده‌شده در این دستور خارج از دامنۀ مجاز قرار دارد؛ به عبارت دیگر، در لیست مد نظر عضوی با این اندیس تعریف نشده است.

حال فرض کنید قصد داریم به زیرمجموعه‌ای از اعضای یک لیست دسترسی داشته باشیم که بیش از یک عضو را شامل می‌شود اما تمامی اعضای لیست را در برنمی‌گیرد که برای انجام چنین کاری بازه‌ای از اندیس‌های مربوط به اعضای مد نظر در لیست مذکور را مورد استفاده قرار می‌دهیم. برای مثال، اگر بخواهیم در listA  اعضای مربوط به هر یک از اندیس‌های 1 تا 3 را در خروجی چاپ کنیم، کدی مانند زیر خواهیم داشت:

>>> listA[1:4]
[2, 3, 4]

همان‌طور که می‌بینید، در دستور بالا از الگویی به صورت [listName[i:j استفاده کرده‌ایم که شناسۀ i نشان‌دهندۀ اندیس اولین عضو مد نظر از لیست است که در این مثال عضو منتسب به اندیس 1 است و شناسۀ j نیز به منظور مشخص کردن عددی یک واحد بیشتر از اندیس آخرین عضو مد نظر از لیست مذکور مورد استفاده قرار می‌گیرد که در این مثال عضوی با اندیس 3 مورد نظر بوده و از همین روی عدد 4 را به عنوان مقدار منتسب به شناسۀ j قرار داده‌ایم؛ به عبارت دیگر، با استفاده از این الگو به اعضایی از لیست که اندیس آن‌ها بزرگ‌تر یا مساوی i و کوچک‌تر از j است دسترسی پیدا می‌کنیم. حال اگر بخواهیم به تمامی اعضای لیست فوق با اندیسی بزرگ‌تر یا مساوی یک اندیس خاص دسترسی پیدا کنیم، کدی مانند زیر خواهیم داشت:

>>> listA[2:]
[3, 4, 5]

در کد فوق گفته‌ایم تمامی اعضای آبجکت لیست که اندیسی بزرگ‌تر یا مساوی 2 دارند را در خروجی ریترن کند و می‌بینیم که سه عدد فوق در معرض دیدمان قرار گرفته است. حال برای دسترسی به اعضایی از listA که اندیس آن‌ها کوچک‌تر از عدد 3 است بدین صورت عمل می‌کنیم:

>>> listA[:3]
[1, 2, 3]

همان‌طور که می‌بینید، در دستور بالا از الگوی [listName[:j استفاده کرده‌ایم تا به اعضایی از لیست دسترسی داشته باشیم که اندیس آن‌ها کوچک‌تر از عدد صحیح 3 (نه مساوی با آن) است.

جالب است بدانید که در زبان برنامه‌نویسی پایتون اعضای یک آبجکت از نوع لیست را می‌توان با اعداد صحیح منفی نیز اندیس‌گذاری کرد که در این صورت اولین عضو از سمت راست لیست اندیس 1- گرفته و به همین ترتیب با یک واحد منفی افزایش به سمت چپ لیست ادامه می‌یابد که به عنوان یک مثال قصد داریم تا با استفاده از اندیس‌های منفی به اعضای listA بدین صورت دسترسی پیدا کنیم:

>>> listA[-1]
5
>>> listA[-2]
4
>>> listA[-3]
3
>>> listA[-4]
2
>>> listA[-5]
1

تاکنون دیدیم که چه‌طور می‌توانیم به اعضای داخل یک لیست دسترسی پیدا کنیم. حال در نظر بگیرید که بخواهیم یکسری پردازش را روی تک‌تک اعضای یک لیست انجام دهیم. برای مثال فرض کنید لیستی از وزن گروهی از ورزشکاران در اختیار داشته و می‌خواهیم آن‌ها بر اساس معیار وزن در سه دستۀ سبک، متوسط و سنگین‌وزن تقسیم‌بندی کنیم که برای این منظور نیاز است تا وزن هر ورزشکار را به صورت جداگانه مورد بررسی قرار دهیم به طوری که ورزشکارهای کمتر از 55 کیلوگرم در دستۀ سبک‌وزن، مابین 55 تا 85 در دستۀ متوسط و بیش از 85 کیلوگرم در دستۀ سنگین‌وزن قرار می‌گیرند که برای پیاده‌سازی چنین مسئله‌ای لیستی همچون مثال زیر خواهیم داشت:

weightList = [['A', 64], ['B', 92], ['C', 49], ['D', 110], ['E', 51], ['F', 73]]

همان‌طور که ملاحظه می‌شود، لیستی تودرتو به منظور ذخیرۀ دیتای مد نظر مورد استفاده قرار داده‌ایم بدین صورت که هر یک از اعضای لیست خود یک لیست بوده و عضو اول آن شناسۀ ورزشکار و عضو دوم آن وزن ورزشکار را نشان می‌دهد که برای مثال اولین عضو از لیست weightList خود لیست مربوط به ورزشکار A با وزن 64 کیلوگرم است. حال به منظور انجام بررسی‌های مورد نظر، به صورت زیر برای تک‌تک ورزشکاران از یک حلقۀ for استفاده می‌کنیم:

weightList = [['A', 64], ['B', 92], ['C', 49], ['D', 110], ['E', 51], ['F', 73]]
for item in weightList:
    if(item[1] <= 55):
        print("Athlete", item[0], "is light-weight.")
    elif(55 < item[1] <= 85 ):
        print("Athlete", item[0], "is in average weight.")
    else:
        print("Athlete", item[0], "is heavy-weight.")

در کد فوق متغیری با شناسۀ item تعریف کرده‌ایم و با به‌کارگیری کیورد in گفته‌ایم در هر بار تکرار حلقۀ for یکی از اعضای دنبالۀ weightList به این متغیر منتسب شود که از همین روی تمامی اعضای این دنباله تک‌تک داخل بدنۀ حلقۀ for مورد بررسی قرار می‌گیرند اما از آن جایی که اعضای weightList خود یک لیست هستند، متغیر item هر بار به یک لیست با دو عضو داخلی منتسب می‌شود و از همین روی با دستور  [item[0  به عضو اول آن (مشخصۀ ورزشکار) و با دستور [item[1 به عضو دوم (وزن ورزشکار) دسترسی پیدا می‌کنیم. بدین ترتیب در بدنۀ حلقۀ for با استفاده از دستورهای شرطی عضو دوم متغیر item یا وزن هر ورزشکار مورد بررسی قرار می‌گیرد و در صورتی که در هر یک از شرط‌ها برقرار باشد، پیغام متناظر آن به همراه مشخصۀ ورزشکار مربوطه در خروجی چاپ می‌شود.

اسکریپت این برنامه را در فایلی به نام listLoop.py ذخیره کرده و آن را اجرا می‌کنیم که در خروجی خواهیم داشت:

Athlete A is in average weight.
Athlete B is heavy-weight.
Athlete C is light-weight.
Athlete D is heavy-weight.
Athlete E is light-weight.
Athlete F is in average weight.

در واقع، با دسترسی به وزن و مشخصۀ هر یک از ورزشکاران، در شرط if چک می‌کنیم که اگر عدد منتسب به آیتم دوم (وزن) کوچک‌تر یا مساوی 55 بود، استرینگ مربوط به سبک‌وزن بودن آن‌ها به همراه مقدار منتسب به آیتم اول (مشخصۀ ورزشکار مد نظر) در خروجی چاپ شود و در غیر این صورت در دستور elif بررسی می‌کنیم اگر این عدد در بازۀ 55 تا 85 قرار داشته باشد، استرینگ مربوط به وزن متوسط ایشان به همراه مشخصۀ متناظر آن برای ورزشکار و در صورت برقرار نبود‌ن هیچ یک از شرایط مذکور، دستور else اجرا شده و استرینگ سنگین‌وزن بودن به همراه مشخصۀ ورزشکار متناظر آن در خروجی چاپ شود.