0Pricing
Competitive Programming Academy · درس

ترتيب مخصص باستخدام functools.cmp_to_key

كتابة مقارن عندما لا تكفي المفاتيح

ترتيب مخصص باستخدام functools.cmp_to_key درس مجاني في Competitive Programming Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Competitive Programming Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.

عندما لا يستطيع key التعبير عن الترتيب

تعتمد بعض الترتيبات على مقارنة عنصرين معًا، لا على قيمة كل عنصر منفردًا. وفي هذه الحالات، تكتب دالة مقارنة بدلًا من key.

ما الذي تعيده دالة المقارنة

تستقبل دالة المقارنة عنصرين هما a وb. أعد عددًا سالبًا إذا كان a يسبق، وموجبًا إذا كان b يسبق، وصفرًا عند التعادل.

def cmp(a, b):
    if a < b: return -1
    if a > b: return 1
    return 0

استخدم cmp_to_key كجسر

لا يقبل فرز Python إلا key، لذا غلّف دالة المقارنة باستخدام functools.cmp_to_key لتحويلها إلى key قابل للاستخدام.

from functools import cmp_to_key
items.sort(key=cmp_to_key(cmp))

مسألة الرقم الأكبر الكلاسيكية

لضم الأعداد في أكبر سلسلة نصية، قارن الأزواج بحسب أي دمج بينها أكبر. ولا يستطيع key عادي التعبير عن ذلك.

def cmp(a, b):
    return (a + b < b + a) - (a + b > b + a)

اقرأ حيلة المقارنة هذه

يعيد التعبير -1 عندما يكون a+b هو الدمج الأكبر، لذا يأتي a قبل b. وبذلك تبني أكبر عدد ممكن.

nums = ["3", "30", "34"]
nums.sort(key=cmp_to_key(cmp))
print("".join(nums))   # 34330

الإشارة هي ما يهم

يقرأ الفرز إشارة النتيجة فقط. فإعادة -2 أو -100 تتصرف مثل إعادة -1، لذا لا تقلق بشأن القيمة الدقيقة.

حافظ على اتساق دوال المقارنة

يجب أن تكون دالة المقارنة متسقة: فإذا تفوق a على b وتفوق b على c، فيجب أن يتفوق a على c. وتؤدي التناقضات إلى ترتيب عشوائي.

فضّل key متى أمكن

يُحسَب key مرة واحدة لكل عنصر، بينما تُشغَّل دالة المقارنة على أزواج كثيرة وتكون أبطأ. استخدم cmp_to_key فقط عندما يتعذر فعلًا استخدام key.

اختصار الطرح

في المقارنات العددية، يمكنك إعادة a - b مباشرةً، لأن إشارتها ترمّز الترتيب أصلًا. وهذا مختصر وآمن مع الأعداد الصحيحة.

items.sort(key=cmp_to_key(lambda a, b: a - b))

انتبه إلى الأعداد العشرية

مع الأعداد العشرية، قد تنتج a - b قيمة صغيرة جدًا أو صفرًا بسبب التقريب. استخدم فروعًا صريحة للمقارنة لتجنب التعادلات الخاطئة.

تتيح دوال المقارنة ترتيبات مخصصة

يصبح ترتيب الدمج، والترتيبات المخصصة، والتعادلات القائمة على القواعد ممكنًا. وتُعد دالة المقارنة حلّك للمخارج في مسائل الفرز المعقدة.

تحقق سريع

تعيد دالة المقارنة عددًا سالبًا عند cmp(a, b).

مراجعة

يمكنك تغليف دالة مقارنة باستخدام cmp_to_key لإنشاء ترتيبات لا يستطيع key التعبير عنها. أعد إشارة، وحافظ على الاتساق، وفضّل key متى استطعت. 🧩

الأسئلة الشائعة

هل درس «ترتيب مخصص باستخدام functools.cmp_to_key» مجاني؟

نعم — نص درس «ترتيب مخصص باستخدام functools.cmp_to_key» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Competitive Programming Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.

ماذا ستتعلم في «ترتيب مخصص باستخدام functools.cmp_to_key»؟

كتابة مقارن عندما لا تكفي المفاتيح تتمرن على Competitive Programming Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Competitive Programming Academy؟

لا تُشترط خبرة سابقة. Competitive Programming Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «ترتيب مخصص باستخدام functools.cmp_to_key»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Competitive Programming Academy هذا؟

نعم. كل درس في Competitive Programming Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏sorted() ودالة key
  2. الترتيب حسب حقول متعددة
  3. ترتيب مخصص باستخدام functools.cmp_to_key
  4. سبب أن الترتيب أولًا يفتح باب الحلول
← العودة إلى Competitive Programming Academy