فهم عملية ترتيب القواميس في بايثون: دليل شامل


مقدمة افتتاحية: هل سبق لك أن تعاملت مع بيانات غير مرتبة في بايثون وتمنيت لو كان بإمكانك تنظيمها بذكاء؟ القواميس (Dictionaries) هي هياكل بيانات قوية، ولكنها بطبيعتها لا تحتفظ بترتيب معين. في هذا الدرس النظري، سنغوص في عالم ترتيب القواميس حسب قيمها، مستكشفين الأدوات الأساسية في بايثون التي تمكننا من تحقيق ذلك بفعالية، مما يمهد الطريق لتحليل وعرض البيانات بشكل منظم واحترافي.

ما هي القواميس في بايثون؟

القواميس في بايثون هي هياكل بيانات تُستخدم لتخزين أزواج من المفاتيح والقيم (key-value pairs). كل مفتاح يجب أن يكون فريدًا، ويشير إلى قيمة معينة. تخيل قاموسًا عاديًا: الكلمة هي المفتاح، ومعناها هو القيمة. في بايثون، يمكن أن تكون المفاتيح أي نوع بيانات غير قابل للتغيير (مثل السلاسل النصية أو الأعداد)، والقيم يمكن أن تكون أي نوع بيانات.

لماذا نحتاج إلى ترتيب القواميس؟

على الرغم من أن القواميس نفسها لا تُعد مرتبة (قبل بايثون 3.7 لم تكن تضمن ترتيب الإدخال، وبعدها أصبحت تضمنه ولكنها لا ترتب تلقائيًا حسب القيمة أو المفتاح)، إلا أن هناك العديد من السيناريوهات التي تتطلب عرض أو معالجة البيانات بترتيب معين. على سبيل المثال:

  • إنشاء لوحة متصدرين (Leaderboard) للدرجات.
  • ترتيب المنتجات حسب السعر أو الشعبية.
  • عرض البيانات الإحصائية من الأعلى للأقل أو العكس.

أدوات بايثون لترتيب القواميس

لترتيب القواميس، نعتمد بشكل أساسي على دالة sorted() بالاشتراك مع بعض المفاهيم الأخرى:

1. الدالة sorted()

تُستخدم دالة sorted() لترتيب أي كائن قابل للتكرار (مثل القوائم، الصفوف، وحتى القواميس). عند تطبيقها على قاموس مباشرة، فإنها ترتب المفاتيح فقط. للحصول على أزواج المفاتيح والقيم لترتيبها، نستخدم الدالة .items().

2. الدالة .items()

تقوم الدالة .items() بإرجاع عرض (view) لعناصر القاموس كقائمة من الصفوف (tuples)، حيث يمثل كل صف زوجًا من (مفتاح، قيمة). هذا العرض هو ما سنقوم بترتيبه.

3. وسيط key ودوال lambda

هنا يكمن سحر الترتيب المخصص. وسيط key في الدالة sorted() يسمح لنا بتحديد دالة تُستخدم لاستخراج مفتاح مقارنة من كل عنصر. وفي حالتنا، نريد الترتيب بناءً على القيمة (الدرجة)، وليس المفتاح (اسم الطالب).

دوال lambda هي دوال صغيرة ومجهولة الهوية (ليس لها اسم) يمكن تعريفها في سطر واحد. إنها مثالية لتحديد دالة key بسرعة. على سبيل المثال، lambda item: item[1] تعني: لكل عنصر (item) في قائمة الصفوف (التي هي (مفتاح، قيمة))، استخرج العنصر الثاني (item[1]) وهو القيمة، واستخدمه للترتيب.

4. وسيط reverse

يسمح لنا وسيط reverse بتحديد اتجاه الترتيب:

  • reverse=False (القيمة الافتراضية): ترتيب تصاعدي (من الأصغر للأكبر).
  • reverse=True: ترتيب تنازلي (من الأكبر للأصغر).

5. تحويل النتيجة إلى قاموس

الدالة sorted() تُرجع قائمة من الصفوف المرتبة. إذا أردنا تحويل هذه القائمة مرة أخرى إلى قاموس مرتب (حيث يتم الحفاظ على ترتيب الإدخال في بايثون 3.7+), يمكننا استخدام مُنشئ القاموس dict().

نظرة على الكود المقدم

دعنا نحلل الكود الذي سنعمل عليه في الدرس العملي لفهم المكونات النظرية:


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()
  • students_scores.items(): تُرجع قائمة من الصفوف مثل [('أحمد', 85), ('سارة', 92), ...].
  • key=lambda item: item[1]: تخبر الدالة sorted() أن تستخدم العنصر الثاني (الدرجة) من كل صف للمقارنة والترتيب.
  • reverse=True: تُطبق الترتيب تنازليًا، من الدرجة الأعلى إلى الأدنى.
  • dict(...): تُحوّل قائمة الصفوف المرتبة إلى قاموس جديد.

خاتمة

فهم كيفية ترتيب القواميس في بايثون هو مهارة أساسية لأي مطور يتعامل مع البيانات. باستخدام دالة sorted()، ووظائف lambda، ووسائط key و reverse، يمكنك تنظيم بياناتك بكفاءة وعرضها بالشكل المطلوب. في الدرس العملي التالي، سنقوم بتطبيق هذه المفاهيم خطوة بخطوة لبناء لوحة متصدرين للطلاب.



🔗 الخطوة التالية: انتقل إلى التطبيق العملي وجرب الكود بنفسك من هنا.