ترتیب درست فقط بیشترین امتیاز نیست
جدول امتیاز زمانی قابلاعتماد است که تکلیف تساوی نیز روشن باشد. در این پروژه ابتدا امتیاز بیشتر جلو میآید و برای امتیاز برابر، نام کوچکتر طبق ترتیب رشتهای Python انتخاب میشود. اگر هر دو کلید برابر باشند، ترتیب ورودی حفظ میشود. این قرارداد با رتبهٔ رقابتی یا رتبهٔ مشترک تفاوت دارد؛ فعلاً رکوردها را مرتب میکنیم، نه اینکه شمارهٔ رتبه تولید کنیم.
sorted با sort چه فرقی دارد؟
تابع sorted یک فهرست تازه برمیگرداند و ورودی را تغییر نمیدهد. متد sort همان فهرست را درجا مرتب میکند و مقدار بازگشتی آن None است. نوشتن نتیجه برابر با players.sort یکی از خطاهای رایج است، چون بهجای رکوردها None میگیرید. برای تابعی که باید دادهٔ اولیه را حفظ کند، sorted انتخاب روشنتری است. این تصمیم هم در تست و هم در استفادهٔ دوباره از ورودی اهمیت دارد.
ساخت کلید چندگانه با tuple
Python تاپلها را از جزء اول مقایسه میکند و فقط در تساوی سراغ جزء بعدی میرود. برای امتیاز عددی نزولی میتوان مقدار منفی امتیاز را کلید اول و نام را کلید دوم گذاشت. با این روش، هر دو جهت مرتبسازی در یک key دیده میشوند. استفادهٔ ساده از reverse=True روی تاپل امتیاز و نام، هر دو کلید را معکوس میکند و با قرارداد نام صعودی برابر نیست.
پایداری چه تضمینی میدهد؟
مرتبسازی Python پایدار است؛ رکوردهای دارای کلید برابر ترتیب قبلی خود را حفظ میکنند. این ویژگی برای چند اجرای قابلتکرار و مرتبسازی چندمرحلهای مفید است. بااینحال پایداری به معنی حفظ همهٔ ترتیب اولیه نیست؛ فقط میان مواردی که کلیدشان برابر است اعمال میشود. اگر شناسهٔ مستقل برای شکستن تساوی لازم دارید، باید آن را به قرارداد و key اضافه کنید، نه اینکه از جایگاه تصادفی انتظار نتیجه داشته باشید.
Unicode همان الفبای انسانی نیست
مقایسهٔ عادی رشته در Python بر اساس مقادیر Unicode انجام میشود و تضمین ترتیب فرهنگمحور فارسی ندارد. تفاوت شکل حروف یا اعراب نیز میتواند جای نام را عوض کند. در این تمرین همین ترتیب فنی بهصراحت انتخاب شده تا تست قابلتکرار باشد. برای فهرست عمومی اشخاص باید نیاز مرتبسازی فارسی، نرمالسازی و ابزار collation را بررسی کنید و نتیجه را با نمونههای واقعی بسنجید.
آزمونهایی برای تساوی و مقدار منفی
یک فهرست خالی، تکرکورد، امتیاز منفی، دو امتیاز برابر با نام متفاوت و دو کلید کاملاً برابر را تست کنید. در نمونهٔ تساوی، نامها را عمداً خلاف ترتیب موردانتظار وارد کنید تا خطای reverse آشکار شود. بررسی کنید ورودی بعد از اجرا تغییر نکرده باشد. برای عددهای ورودی متناهی و صحیح، رفتار مقایسه روشن است؛ دادهٔ گمشده یا NaN در این پروژه تعریف نشده است.
از مرتبسازی تا رتبهٔ نمایشی
اگر میخواهید شمارهٔ رتبه نمایش دهید، ابتدا میان رتبهٔ متراکم و رقابتی انتخاب کنید. دنبالهٔ ۱،۲،۲،۳ با ۱،۲،۲،۴ معنای یکسانی ندارد. نام میتواند فقط ترتیب نمایش افراد دارای امتیاز برابر را تعیین کند و لزوماً رتبهٔ متفاوت نسازد. این توسعه را بهصورت تابع جدا تمرین کنید تا منطق مرتبسازی، محاسبهٔ رتبه و نمایش رابط با هم مخلوط نشوند.
نمونهکد و قرارداد پروژه
players: فهرست رکوردهای name رشته و score عدد صحیح؛ امتیاز منفی و فهرست خالی مجاز است.
ranking: همان رکوردها با امتیاز نزولی و در تساوی، نام صعودی طبق ترتیب Unicode پایتون؛ تساوی هر دو کلید ترتیب اولیه را حفظ میکند.
def solve(data):
return {'ranking': sorted(data['players'],
key=lambda item: (-item['score'], item['name']))}
print(solve({'players': [{'name': 'سارا', 'score': 80}, {'name': 'علی', 'score': 95}, {'name': 'مینا', 'score': 80}]}))خروجی مورد انتظار
{
"ranking": [
{
"name": "علی",
"score": 95
},
{
"name": "سارا",
"score": 80
},
{
"name": "مینا",
"score": 80
}
]
}پرسشهای متداول
آیا reverse فقط امتیاز را معکوس میکند؟
نه. reverse ترتیب مقایسهٔ کل کلید را معکوس میکند؛ برای جهتهای متفاوت، key ترکیبی مناسب بسازید.
آیا sorted ورودی را تغییر میدهد؟
خیر. فهرست تازه تولید میکند؛ برای مرتبسازی درجا متد sort وجود دارد که مقدار بازگشتیاش None است.
تمرین عملی و قدم بعدی
پروژهٔ «رتبهبندی امتیازها» همین قرارداد را در میزکار ارزیابی میکند. ابتدا خروجی نمونه را دستی محاسبه کنید، سپس تابع را اجرا کنید و یک ورودی مرزی متفاوت بسازید. نمونهکد راهی برای توضیح منطق است؛ برای یادگیری، علت هر شرط و انتخاب ساختار داده را بدون نگاهکردن به کد توضیح دهید. اجرای موفق با قبولی ارزیابی متفاوت است؛ نتیجه باید برای تمام حالتهای تعریفشده درست بماند.
منابع و مطالعهٔ بیشتر
برای بررسی جزئیات و ادامهٔ مطالعه؛ متن این راهنما مستقلاً برای نوونتیکس نوشته شده است.
