چگونه از ساختار داده List در پایتون استفاده کنیم؟

پایتون مجموعه ای از ساختار های داده (یا نوع داده) داخلی را دارد که به کمک آن ها عملیات های متداول پردازش داده ها، آسان می شود. list یکی از این انواع داده است. یک نوع مجموعه داده (Collection Type) ساده اما کاربردی. با استفاده از لیست در پایتون ، می توانید تعدادی داده یا شئ (object) را در یک متغیر قرار داده و با استفاده از ایندکس و موقعیتشان، به آن ها دسترسی داشته و بتوانید آن ها را اضافه، حذف، مرتب و همچنین به گروه های کوچکتر تقسیم کنید.

مفاهیم و پایه های لیست در پایتون

نحوه تعریف یک لیست در پایتون بسیار ساده است. فقط کافیست تا از براکت [] برای تعریف آیتم ها در یک لیست استفاده کنید.

داده های یک لیست، لزوما نباید نوع یکسانی داشته باشند. همچنین می توانید اشیاء را نیز در یک لیست قرار دهید.

توجه داشته باشید که استفاده از اشیاء و داده ها با انواع متفاوت، می تواند بر روی مرتب سازی تأثیراتی بگذارید که در ادامه به آن خواهیم پرداخت.

می توان گفت بزرگترین هدف لیست این است که بع اشیاء داخل آن با استفاده از موقعیت شان دسترسی پیدا کنیم. برای این کار از ایندکس استفاده می کنیم. ایندکس برای اشاره به عناصر یک لیست استفاده می شود و از صفر شروع شده و بین براکت قرار می گیرد.

در لیست بالا، list_of_objects[0] مقدار “One” و list_of_objects[1] مقدار 2 را بر می گرداند.

ایندکس گذاری عناصر در پایتون

اگر از یک عدد صحیح مثبت برای اندیس استفاده کنید، پایتون عنصر مورد نظر را با استفاده از موقعیت آن نسبت به ابتدای لیست بر می گرداند. اگر از مقادیر منفی برای ایندکس استفاده کنید، پایتون موقعیت عناصر را از انتهای لیست در نظر می گیرد. برای مثال ایندکس 1- به عنصر آخر یک لیست اشاره دارد. به طور مثال در لیست بالا، list_of_objects[-1] مقدار None را بر میگرداند.

حذف و اضافه کردن عناصر لیست در پایتون

پایتون برای این کار ها چندین روش را فراهم کرده است:

  • تابع ()append : یک عنصر یا آیتم را به انتهای لیست اضافه می کند.
  • تابع (index)pop : آیتمی که موقعیت آن برابر با ایندکس ارسالی است را حذف کرده و برمی گرداند. اگر هیچ آرگومانی را ارسال نکنیم، آیتم آخر لیست را حذف کرده و بر می گرداند.
  • تابع insert(index, item) : این تابع آیتم را در موقعیت مشخص شده اضافه می کند. توجه داشته باشید که آیتم فعلی در موقعیت داده شده حذف نمی شود بلکه تمام آیتم های بعد از آن یک ایندکس به جلو می روند. اگر لیست شما خیلی بزرگ باشد، استفاده از این تابع کمی کند خواهد بود.
  • تابع remove(item) : در تابع یک شئ را به عنوان آرگومان ارسال می کنیم و لیست اولین عنصری را که با آن شئ برابر باشد، حدف می کند.

مثال ها:

لیست my_list[3,7,7,9,8] را در نظر بگیرید. اگر my_list.pop(0) را فراخوانی کنیم، لیست به شکل [7,7,9,8] در می آید. اگر my_list.remove(7) را فراخوانی کنیم (روی لیست اصلی)، لیست به شکل [3,7,9,8] تبدیل خواهد شد.

Slicing (برش دادن) لیست در پایتون

لیست ها را می توان به لیست های جدیدی تقسیم کرد. این کار Slicing نام دارد. پایتون این امکان را می دهد تا مکان جدا کردن لیست و اندازه آن را مشخص کنید.

به صورت کلی، برای جدا کردن قسمتی از لیست از سینتکس رو به رو استفاده می کنیم. list_object[start:stop:step]

  • start : مشخص می کند که لیست جدید از چه موقعیتی (اندیس) در لیست اصلی شروع به جدا کردن کند.
  • stop : انتهای لیست جدید را در یک موقعیت از لیست اصلی مشخص می کند.
  • step : استفاده از این گزینه اختیاری است و مشخص می کند که عناصر لیست اصلی به صورت مضربی از این عدد به لیست جدید اضافه شوند. اگر 1 انتخاب شود، تمام عناصر لیست جدا شده را بر می گرداند. اگر 3 انتخاب شده باشد، عناصر اول، سوم، ششم، نهم و … را از لیست جدا شده را بر می گرداند.

در مثال زیر، ما عناصر 0 تا 5 لیست اصلی را جدا کرده ایم:

حال در مثال زیر، عناصر لیست جدا شده را به صورت مضربی از 2 جدا کرده ایم:

اگر مقدار start را مشخص نکنید، پایتون ابتدای لیست را برای ابتدای لیست جدید در نظر می گیرد.

همچنین اگر مقدار stop را نیز مشخص نکنید، پایتون انتهای لیست را برای پایان لیست جدید در نظر می گیرد.

مقدار step می تواند منفی باشد. در این صورت، مقادیر انتخاب شده را به صورت برعکس بر می گرداند.

همچنین به یاد داشته باشید که عمل slicing، یک کپی از لیست اصلی ایجاد کرده و تغییرات را روی آن انجام می دهد و در نهایت لیست جدید را بر می گرداند. لیست اصلی تغییری نخواهد کرد.

مرتب سازی list ها در پایتون

پایتون در دو روش یک لیست را مرتب می کند. در روش اول، لیست اصلی را به صورت مرتب شده در یک لیست جدید کپی می کند و لیست اصلی تغییر نخواهد کرد. در روش دوم، پایتون هیچ لیست جدیدی ایجاد نکرده و خود لیست را مرتب می کند.

برای ایجاد یک لیست جدید که مرتب شده لیست اصلی است، از تابع ()sorted استفاده می کنیم:

این تابع محتویات آن را بر اساس مرتب سازی پیش فرض پایتون انجام می دهد. یعنی برای رشته ها برا اساس حروف الفبا و برای اعداد به ترتیب صعودی مرتب می کند. همچنین لیستی که می خواهد مرتب شود، باید تمام نوع داده های عتاصر آن سازگار باشند. به عنوان مثال شما نمی توانید لیستی را مرتب کنید که ترکیبی از اعداد و رشته ها باشد. در غیر این صورت، خطای TypeError را در حین مرتب سازی درافت خواهید کرد.

اگر می خواهید یک لیست را به صورت وارونه مرتب کنید، مقدار True را برای پارامتر reverse قرار دهید:

راه دیگر مرتب کردن لیست ها، اصطلاحا مرتب سازی “در جا” نام دارد. در این روش لیست جدید ایجاد نمی شود و تغییرات بر روی خود لیست اصلی اعمال می شوند. می توانید از تابع ()sort لیست مورد نظر برای مرتب سازی در جای آن استفاده کنید.

مانند روش قبلی برای مرتب سازی به صورت وارونه، پارامتر reverse را برای آن ارسال کنید.

مرتب سازی سفارشی

هر دو تابع ()sorted و ()sort ، یک پارامتر به نام key در یافت می کنند که به شما امکان می دهد که تابعی را تعریف کرده و با استفاده از آن نحوه مرتب سازی را هر طور که می خواهید مشخص می کنید. این کار به ویژه برای اشیاء (object) مختلف که حاوی داده های مختلفی است استفاده میشود. برای مثال می توانید معیار مرتب سازی را یکی از فیلد های یک شئ قرار دهید. کاربرد دیگر آن نیز آن است که می توانید لیست هایی را که عناصر آن از انواع داده مختلف تشکیل شده است، مرتب کنید. برای درک بهتر به مثال زیر توجه کنید.

مثال:

توجه داشته باشید که کد بالا تمام عناصر لیست را به نوع int تبدیل نمی کند. بلکه از مقدار عدد صحیح هر عنصر برای مرتب سازی استفاده می کند (همانطور که احتمالا بدانید، تمامی کاراکتر ها یک معادل عددی دارند که به کد اسکی (Ascii) معروف است و cpu کاراکتر ها را با کد اسکی آن ها می شناسد). همچنین یک بلاک try/except نیز در نظر گرفت تا احیانا اگر داده ای معادل عددی نداشت (مانند None)، مقدار 0 را برای آن در نظر می گیریم.

لیست ها در پایتون با آرایه ها فرق دارند

نکته دیگری که بهتر است در مورد لیست ها در پایتون بدانید، این است که آن ها آرایه نیستند. زبان های برنامه نویسی دیگر مانند C دارای ساختار یک بعدی یا چند بعدی به نام آرایه هستند که فقط عناصری از یک نوع را می پذیرند. اما لیست ها در پایتون ناهمگن هستند و می تواند عناصری با نوع داده مختلف بپذیرند.

علاوه بر این، پایتون خود دارای ساختار داده آرایه است که همانند سایر زبان ها است که قابلیت کار با آرایه های زبان C را نیز می دهد.

چه موقع از لیست ها استفاده کنیم؟

در موارد زیر، استفاده از لیست در پایتون بهترین انتخاب است:

  • شما باید فورا عناصر را با توجه به موقعیتشان در یک مجموعه پیدا کنید.
  • شما می خواهید داده ها را عمدتا به آخر لیست اضافه و یا از آخر آن حذف کنید و از لیست مانند یک پشته (Stack) استفاده کنید.

در موارد زیر، استفاده از لیست در پایتون زیاد توصیه نمی شود:

  • شما می خواهید عنصر یا داده خاصی را در لیست پیدا کنید که موقعیت یا اندیس آن را نمی دانید. برای این کار می توانید از تابع ()index استفاده کنید که داده مورد نظر را به عنوان پارامتر گرفته و اندیس آن در لیست را بر می گرداند. اگر لیست شما خیلی بزرگ باشد، این کار خیلی زمان بر خواهد بود زیزرا باید کل لیست جستجو شود. در عوض می توانید از دیکشنری ها استفاده کنید که هر عنصر دارای یک کلید بوده و برای دسترسی به آن از آن کلید استفاده می کنیم.
  • شما می خواهید داده ای را از هر موقعیتی (به جز انتهای لیست) حذف یا اضافه کنید. با انجام این کار، پایتون هر بار باید تمام داده های بعد از آن داده جدید را به موقعیت جدیدشان متقل کند. این کار در یک لیست بزرگ باعث افت سرعت و عملکرد برنامه خواهد شد. برای این کار می توانید از شئ deque استفاده کنید و عناصر را آزادنه و با سرعت بیشتر به هر کجا که خواستید اضافه کرده و یا از آن جا حذف نمایید.
QR:  چگونه از ساختار داده List در پایتون استفاده کنیم؟
به اشتراک بگذارید