حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش الگوریتم و حل مسئله با پایتون؛ تمرین عملی

رفع باگ تساوی پایدار در مرتب‌سازی امتیاز پایتون

مرتب‌سازی سفارشی پایتون؛ key و ترتیب پایدار · 0٪

✍️ گاهی تساوی خودش معنی دارد: دو شرکت‌کننده امتیاز یکسان دارند و می‌خواهیم ترتیب ثبتشان حفظ شود. پایتون این رفتار را در مرتب‌سازی پایدار فراهم می‌کند؛ کافی است فقط همان کلید خواسته‌شده را بدهیم. افزودن نام به کلید، یک معیار تازه ایجاد می‌کند و دیگر تساوی امتیاز به معنی حفظ ترتیب ثبت نخواهد بود.

مثلاً رکوردهای Ziba با هشت، Amir با هشت و Nima با پنج را در نظر بگیر. ترتیب نزولی امتیاز باید Ziba، Amir، Nima باشد. اینکه Amir از نظر الفبا زودتر است، در این قرارداد نقشی ندارد. کد اولیه نام را هم وارد کلید کرده و دو عضو هم‌امتیاز را جابه‌جا می‌کند.

تابع را اصلاح کن و فقط فهرست نام‌ها را برگردون. sorted روی رکوردها نسخه تازه می‌سازد، بنابراین نیاز نیست فهرست ورودی را تغییر بدهیم. رکوردها کلیدهای name و score دارند؛ مقدار امتیاز صحیح است و نام رشته. خطای رایج دیگر، مرتب کردن صعودی و بعد برعکس کردن فهرست نتیجه است؛ این کار ترتیب تساوی‌ها را هم برعکس می‌کند. جهت نزولی را در خود مرتب‌سازی یا با کلید منفی اعمال کن.

تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا می‌زند و حفظ ورودی را بررسی می‌کند. آن را تغییر نده؛ پاسخ تو همان تابع خواسته‌شده است.

فعالیت شما

تابع score_names(records) فهرست دیکشنری‌های دارای name رشته و score عدد صحیح را می‌گیرد؛ نام‌ها را بر اساس score نزولی برگرداند. امتیاز مساوی باید ترتیب ورودی را حفظ کند؛ نام معیار دوم نیست. خالی []، تک‌عضوی همان نام؛ امتیاز صفر و منفی هم مجاز است. برای Ziba:8 سپس Amir:8 خروجی همین ترتیب است. فهرست و رکوردهای ورودی تغییر نکنند. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا می‌زند و حفظ ورودی را بررسی می‌کند. آن را تغییر نده؛ پاسخ تو همان تابع خواسته‌شده است.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

def score_names(records):
    ordered = sorted(records, key=lambda item: (-item['score'], item['name']))
    return [item['name'] for item in ordered]

# این تابع آماده فقط برای ارزیابی است؛ آن را تغییر نده.
def course_check(*args):
    from copy import deepcopy
    before = deepcopy(args)
    result = score_names(*args)
    if args != before:
        raise ValueError('ورودی نباید تغییر کند.')
    return result