سطح مقدماتی (Beginner Level)
مرتبسازی دادهها یکی از پرکاربردترین عملیاتها در برنامهنویسی است. پایتون دو روش اصلی برای این کار ارائه میدهد: متد sort() و تابع sorted(). در این بخش با اصول اولیه کار با این ابزارها آشنا میشویم.
تفاوت sort() و sorted()
مهمترین نکتهای که در ابتدا باید بدانید، تفاوت عملکرد این دو دستور است:
list.sort(): لیست را درجا (In-place) تغییر میدهد. یعنی لیست اصلی تغییر میکند و خروجی تابعNoneاست.sorted(iterable): یک لیست جدید میسازد و لیست اصلی را دستنخورده باقی میگذارد.
مثال اول: استفاده از sort (تغییر لیست اصلی)
در این مثال میبینید که لیست اصلی تغییر میکند.
مثال دوم: استفاده از sorted (ساخت لیست جدید)
این روش برای زمانی مناسب است که میخواهید دادههای اصلی حفظ شوند.
مرتبسازی معکوس (Reverse Sorting)
هر دو دستور sort و sorted یک پارامتر به نام reverse دارند. اگر مقدار آن را True قرار دهید، مرتبسازی به صورت نزولی (از بزرگ به کوچک) انجام میشود.
مثال اول: مرتبسازی نزولی اعداد
مثال دوم: مرتبسازی نزولی رشتهها
در رشتهها، ترتیب بر اساس حروف الفبا (و کدهای ASCII) است.
سطح پیشرفته (Professional Level)
در سطح حرفهای، مرتبسازی فراتر از اعداد ساده و رشتههاست. ما نیاز داریم لیستی از دیکشنریها، تاپلها یا آبجکتهای پیچیده را بر اساس معیارهای خاص مرتب کنیم. پایتون برای این کار از پارامتر قدرتمند key استفاده میکند.
استفاده از پارامتر Key
پارامتر key یک تابع را دریافت میکند که روی هر عنصر لیست اعمال میشود و نتیجه آن تابع، معیار مرتبسازی قرار میگیرد.
مثال اول: مرتبسازی رشتهها بر اساس طول (Length)
به جای حروف الفبا، میخواهیم کلمات کوتاهتر اول بیایند.
مثال دوم: مرتبسازی غیرحساس به بزرگی و کوچکی حروف
به طور پیشفرض در پایتون، حروف بزرگ (Uppercase) قبل از حروف کوچک (Lowercase) قرار میگیرند (مثلاً 'Z' قبل از 'a' است). برای رفع این مشکل از str.lower استفاده میکنیم.
مرتبسازی ساختارهای داده پیچیده (List of Dicts / Tuples)
در برنامههای واقعی، اغلب با لیستی از دیکشنریها یا تاپلها سروکار داریم. برای مرتبسازی اینها معمولاً از lambda استفاده میکنیم.

مثال اول: مرتبسازی لیست تاپلها
فرض کنید لیستی از دانشآموزان و نمرات آنها داریم و میخواهیم بر اساس نمره (عنصر دوم تاپل) مرتب کنیم.
مثال دوم: مرتبسازی لیست دیکشنریها
این سناریو در کار با APIها و دیتابیسها بسیار رایج است.
پایداری در مرتبسازی (Stability) و مرتبسازی چندمرحلهای
الگوریتم مرتبسازی پایتون (Timsort) پایدار (Stable) است. این یعنی اگر دو عنصر مقدار مساوی داشته باشند، ترتیب اولیهشان در لیست حفظ میشود. این ویژگی اجازه میدهد تا مرتبسازیهای چندمرحلهای انجام دهیم.
فرض کنید میخواهیم لیست را اول بر اساس نام، و سپس بر اساس سن مرتب کنیم.
نکات عملکردی (Performance) با itemgetter
اگرچه lambda بسیار منعطف است، اما برای عملیاتهای سنگین و لیستهای بسیار بزرگ، استفاده از ماژول operator.itemgetter کمی سریعتر و بهینهتر است.
# Static: importing necessary module
from operator import itemgetter
مرتبسازی کلاسهای سفارشی (Custom Objects)
برای اینکه بتوانید آبجکتهای کلاس خود را مستقیماً sort() کنید، باید متد __lt__ (کوچکتر از) را در کلاس پیادهسازی کنید.