تطبيق عملي: بناء لوحة متصدرين للطلاب باستخدام ترتيب القواميس في بايثون


📚 مراجعة سريعة: هذا التطبيق العملي مبني على مفهوم برمجي أساسي. راجع الدرس النظري من هنا أولاً.



مقدمة افتتاحية: بعد أن استوعبنا الجوانب النظرية لترتيب القواميس في بايثون، حان الوقت لتطبيق هذه المعرفة عمليًا! في هذا الدرس المثير، سنقوم بتحويل مجموعة عشوائية من درجات الطلاب إلى لوحة متصدرين مرتبة بشكل أنيق. ستتعلم كيف تستخدم دالة sorted() ودوال lambda لتحقيق هذا الهدف خطوة بخطوة، مما يمكنك من بناء تطبيقات أكثر ذكاءً وتنظيمًا للبيانات.

الهدف: بناء لوحة متصدرين

لنفترض أن لدينا قاموسًا يحتوي على أسماء الطلاب ودرجاتهم. هدفنا هو عرض هؤلاء الطلاب مرتبين تنازليًا حسب درجاتهم، بحيث يظهر صاحب أعلى درجة في المقدمة. هذا مفيد جدًا في أنظمة إدارة المدارس، أو حتى في الألعاب لعرض أفضل اللاعبين.

البيانات الأولية

سنبدأ بإنشاء قاموس بايثون يمثل درجات الطلاب. لاحظ أن هذا القاموس غير مرتب حاليًا، فالترتيب يعتمد على كيفية إدخال العناصر، وليس على قيم الدرجات.


    students_scores = {
        'أحمد': 85,
        'سارة': 92,
        'خالد': 78,
        'فاطمة': 95,
        'علي': 88
    }

عند طباعة هذا القاموس مباشرة، ستحصل على ترتيب غير متوقع للدرجات:


    print("البيانات قبل الترتيب:", students_scores)

الناتج المتوقع:


    البيانات قبل الترتيب: {'أحمد': 85, 'سارة': 92, 'خالد': 78, 'فاطمة': 95, 'علي': 88}

خطوات الترتيب

الخطوة 1: الحصول على أزواج المفاتيح والقيم

لترتيب القاموس بناءً على قيمه، نحتاج أولاً إلى الوصول إلى كل زوج (مفتاح، قيمة) معًا. هنا يأتي دور الدالة .items()، التي تُرجع قائمة من الصفوف:


    students_scores.items()
    # الناتج: dict_items([('أحمد', 85), ('سارة', 92), ('خالد', 78), ('فاطمة', 95), ('علي', 88)])

الخطوة 2: استخدام الدالة sorted() مع key و reverse

الآن، سنمرر نتيجة .items() إلى الدالة sorted(). سنستخدم وسيط key لتحديد أننا نريد الترتيب بناءً على العنصر الثاني من كل صف (وهو الدرجة)، ووسيط reverse=True للترتيب التنازلي.


    sorted_items = sorted(students_scores.items(), key=lambda item: item[1], reverse=True)
  • key=lambda item: item[1]: تخبر بايثون أن لكل item (صف مثل ('أحمد', 85))، استخدم العنصر الموجود في الفهرس [1] (وهو 85) كقيمة للمقارنة.
  • reverse=True: هذا الوسيط يجعل الترتيب تنازليًا، أي من الدرجة الأعلى إلى الأقل.

الناتج من sorted_items سيكون:


    [('فاطمة', 95), ('سارة', 92), ('علي', 88), ('أحمد', 85), ('خالد', 78)]

لاحظ أن النتيجة هي قائمة من الصفوف، وليست قاموسًا بعد.

الخطوة 3: تحويل النتيجة إلى قاموس جديد

إذا أردنا الحصول على قاموس جديد مرتب، يمكننا ببساطة تمرير القائمة المرتبة من الصفوف إلى مُنشئ القاموس dict():


    sorted_scores = dict(sorted_items)

الناتج من sorted_scores سيكون:


    {'فاطمة': 95, 'سارة': 92, 'علي': 88, 'أحمد': 85, 'خالد': 78}

الآن أصبح لدينا قاموس مرتب حسب الدرجات!

الخطوة 4: عرض لوحة المتصدرين

أخيرًا، يمكننا طباعة لوحة المتصدرين بشكل جميل باستخدام حلقة for للتكرار على القاموس المرتب:


    print("\nالطلاب الأوائل بالترتيب:")
    for name, score in sorted_scores.items():
        print(f"المركز: {name} (الدرجة: {score})")

الكود البرمجي الكامل

إليك الكود الكامل الذي يجمع كل الخطوات المذكورة أعلاه:


def sort_dict_by_value():
    # قاموس يحتوي على أسماء الطلاب ودرجاتهم بشكل عشوائي
    students_scores = {
        'أحمد': 85,
        'سارة': 92,
        'خالد': 78,
        'فاطمة': 95,
        'علي': 88
    }

    print("البيانات قبل الترتيب:", students_scores)

    # الترتيب تنازلياً (من الأعلى للأقل) حسب القيمة (الدرجة)
    # نستخدم lambda للتركيز على العنصر الثاني (x[1]) وهو القيمة
    sorted_scores = dict(sorted(students_scores.items(), key=lambda item: item[1], reverse=True))

    print("\nالطلاب الأوائل بالترتيب:")
    for name, score in sorted_scores.items():
        print(f"المركز: {name} (الدرجة: {score})")

sort_dict_by_value()

تشغيل الكود والنتائج

عند تشغيل هذا الكود في بيئة بايثون لديك، ستحصل على الناتج التالي:


البيانات قبل الترتيب: {'أحمد': 85, 'سارة': 92, 'خالد': 78, 'فاطمة': 95, 'علي': 88}

الطلاب الأوائل بالترتيب:
المركز: فاطمة (الدرجة: 95)
المركز: سارة (الدرجة: 92)
المركز: علي (الدرجة: 88)
المركز: أحمد (الدرجة: 85)
المركز: خالد (الدرجة: 78)

تهانينا! لقد نجحت في بناء لوحة متصدرين بسيطة وفعالة باستخدام مهاراتك الجديدة في ترتيب القواميس.

خاتمة

لقد رأيت كيف يمكن لعدد قليل من الأسطر البرمجية أن تحدث فرقًا كبيرًا في تنظيم البيانات وعرضها. هذه التقنية ليست مفيدة فقط للوحات المتصدرين، بل هي أساسية للعديد من مهام معالجة وتحليل البيانات في تطوير الويب والتطبيقات الأخرى. جرب تغيير الدرجات أو إضافة طلاب جدد، أو حتى الترتيب تصاعديًا (عن طريق إزالة reverse=True) وشاهد كيف تتغير النتائج!