الترتيب حسب حقول متعددة
كسر التعادل بمفاتيح الصفوف وreverse
الترتيب حسب حقول متعددة درس مجاني في Competitive Programming Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Competitive Programming Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.
عندما لا يكفي مفتاح واحد
تتساوى العناصر أحيانًا في الحقل الأول، ويجب عليك كسر التعادل. والحل هو مفتاح tuple يسرد الحقول حسب أولوية الفرز.
تُقارن tuple من اليسار إلى اليمين
تقارن Python قيم tuple عنصرًا تلو الآخر: فتفحص العنصر الأول، ولا تنظر إلى الثاني إلا عندما يتعادل الأول.
print((1, 9) < (1, 2)) # False
print((1, 2) < (2, 0)) # Trueمفتاح tuple لحقلين
أعد tuple من دالة key لفرز العناصر حسب الحقل الأول، ثم الثاني. وهكذا تفرز الأشخاص حسب العمر، ثم حسب الاسم.
people.sort(key=lambda p: (p.age, p.name))الترتيب الأساسي والثانوي
الحقل الموجود في أقصى اليسار هو الفرز الأساسي، والذي يليه هو كاسر التعادل. أعد ترتيب tuple لتغيير الحقل المسيطر.
data = [(2, "b"), (1, "z"), (1, "a")]
print(sorted(data))
# [(1, 'a'), (1, 'z'), (2, 'b')]اخلط الترتيب التصاعدي والتنازلي
لفرز حقل تصاعديًا وآخر تنازليًا، اعكس الإشارة العددية للحقل الذي تريده تنازليًا داخل مفتاح tuple.
items.sort(key=lambda x: (x.group, -x.score))حيلة عكس الإشارة تحتاج إلى أعداد
تعمل حيلة إشارة الطرح مع الأعداد فقط. ولعكس ترتيب حقل سلسلة نصية، يجب أن تستخدم فرزات متتالية بدلًا من عكس الإشارة.
يتيح لك الفرز المستقر الترتيب على مراحل
بما أن الفرز مستقر، يمكنك الفرز حسب المفتاح الثانوي أولًا، ثم حسب المفتاح الأساسي، وستبقى العناصر المتعادلة مرتبة بصورة صحيحة.
rows.sort(key=lambda r: r.name)
rows.sort(key=lambda r: r.age, reverse=True)الترتيب على مراحل أم tuple واحدة
يكون مفتاح tuple أسرع وأوضح في الحالات البسيطة. وتتألق الفرزات المتتالية عندما يكون أحد الحقول تصاعديًا كسلسلة نصية والآخر تنازليًا.
itemgetter للسرعة
بالنسبة إلى tuple المعتمدة على الفهارس، تُعد itemgetter مفتاحًا أنيقًا وسريعًا. وهي تستخرج عدة حقول دفعة واحدة حسب الأولوية.
from operator import itemgetter
rows.sort(key=itemgetter(1, 0))كسر التعادلات يجعل الناتج حتميًا
إن إضافة كاسر تعادل نهائي فريد مثل id تجعل الناتج ثابتًا بين عمليات التشغيل، وهو ما تقدّره أنظمة التحكيم ذات أدوات التحقق الصارمة.
خطّط لمفتاحك قبل كتابة التعليمات البرمجية
اقرأ المسألة واكتب حقول الفرز بالترتيب. يحوّل مفتاح tuple الواضح مقارنةً معقدة إلى سطر قصير واحد.
تحقق سريع
تريد ترتيب الطلاب حسب الدرجة تصاعديًا، ثم حسب الاسم تصاعديًا.
مراجعة
يمكنك كسر التعادلات باستخدام مفتاح tuple، وعكس إشارة الأعداد للترتيب التنازلي، واستخدام فرزات مستقرة متتالية للاتجاهات المختلطة. وتحافظ كواسر التعادل على نظافة الناتج. ✅
الأسئلة الشائعة
هل درس «الترتيب حسب حقول متعددة» مجاني؟
نعم — نص درس «الترتيب حسب حقول متعددة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Competitive Programming Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Competitive Programming Academy 4 دروس في المجموع.
ماذا ستتعلم في «الترتيب حسب حقول متعددة»؟
كسر التعادل بمفاتيح الصفوف وreverse تتمرن على Competitive Programming Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Competitive Programming Academy؟
لا تُشترط خبرة سابقة. Competitive Programming Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «الترتيب حسب حقول متعددة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Competitive Programming Academy هذا؟
نعم. كل درس في Competitive Programming Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- sorted() ودالة key
- الترتيب حسب حقول متعددة
- ترتيب مخصص باستخدام functools.cmp_to_key
- سبب أن الترتيب أولًا يفتح باب الحلول