خانه / آموزش‌ها / مرتب‌سازی در پایتون (Sorting)

مرتب‌سازی در پایتون (Sorting)

🐍 HomeOfPython
|
📅 1404/10/21

سطح مقدماتی (Beginner Level)

مرتب‌سازی داده‌ها یکی از پرکاربردترین عملیات‌ها در برنامه‌نویسی است. پایتون دو روش اصلی برای این کار ارائه می‌دهد: متد sort() و تابع sorted(). در این بخش با اصول اولیه کار با این ابزارها آشنا می‌شویم.

تفاوت sort() و sorted()

مهم‌ترین نکته‌ای که در ابتدا باید بدانید، تفاوت عملکرد این دو دستور است:

  1. list.sort(): لیست را درجا (In-place) تغییر می‌دهد. یعنی لیست اصلی تغییر می‌کند و خروجی تابع None است.
  2. sorted(iterable): یک لیست جدید می‌سازد و لیست اصلی را دست‌نخورده باقی می‌گذارد.

مثال اول: استفاده از sort (تغییر لیست اصلی)

در این مثال می‌بینید که لیست اصلی تغییر می‌کند.

Python

مثال دوم: استفاده از sorted (ساخت لیست جدید)

این روش برای زمانی مناسب است که می‌خواهید داده‌های اصلی حفظ شوند.

Python

مرتب‌سازی معکوس (Reverse Sorting)

هر دو دستور sort و sorted یک پارامتر به نام reverse دارند. اگر مقدار آن را True قرار دهید، مرتب‌سازی به صورت نزولی (از بزرگ به کوچک) انجام می‌شود.

مثال اول: مرتب‌سازی نزولی اعداد

Python

مثال دوم: مرتب‌سازی نزولی رشته‌ها

در رشته‌ها، ترتیب بر اساس حروف الفبا (و کدهای ASCII) است.

Python

سطح پیشرفته (Professional Level)

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

استفاده از پارامتر Key

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

مثال اول: مرتب‌سازی رشته‌ها بر اساس طول (Length)

به جای حروف الفبا، می‌خواهیم کلمات کوتاه‌تر اول بیایند.

Python

مثال دوم: مرتب‌سازی غیرحساس به بزرگی و کوچکی حروف

به طور پیش‌فرض در پایتون، حروف بزرگ (Uppercase) قبل از حروف کوچک (Lowercase) قرار می‌گیرند (مثلاً 'Z' قبل از 'a' است). برای رفع این مشکل از str.lower استفاده می‌کنیم.

Python

مرتب‌سازی ساختارهای داده پیچیده (List of Dicts / Tuples)

در برنامه‌های واقعی، اغلب با لیستی از دیکشنری‌ها یا تاپل‌ها سروکار داریم. برای مرتب‌سازی این‌ها معمولاً از lambda استفاده می‌کنیم.

ساختار مرتب‌سازی با کلید

مثال اول: مرتب‌سازی لیست تاپل‌ها

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

Python

مثال دوم: مرتب‌سازی لیست دیکشنری‌ها

این سناریو در کار با APIها و دیتابیس‌ها بسیار رایج است.

Python

پایداری در مرتب‌سازی (Stability) و مرتب‌سازی چندمرحله‌ای

الگوریتم مرتب‌سازی پایتون (Timsort) پایدار (Stable) است. این یعنی اگر دو عنصر مقدار مساوی داشته باشند، ترتیب اولیه‌شان در لیست حفظ می‌شود. این ویژگی اجازه می‌دهد تا مرتب‌سازی‌های چندمرحله‌ای انجام دهیم.

فرض کنید می‌خواهیم لیست را اول بر اساس نام، و سپس بر اساس سن مرتب کنیم.

Python

نکات عملکردی (Performance) با itemgetter

اگرچه lambda بسیار منعطف است، اما برای عملیات‌های سنگین و لیست‌های بسیار بزرگ، استفاده از ماژول operator.itemgetter کمی سریع‌تر و بهینه‌تر است.

python
# Static: importing necessary module
from operator import itemgetter
Python

مرتب‌سازی کلاس‌های سفارشی (Custom Objects)

برای اینکه بتوانید آبجکت‌های کلاس خود را مستقیماً sort() کنید، باید متد __lt__ (کوچک‌تر از) را در کلاس پیاده‌سازی کنید.

Python