المحطّة ٣: الخوارزميّات والتحليل
حوّل البيانات إلى معرفة: متوسّطاتٌ وترتيبٌ وترشيحٌ يبرز من يحتاج دعمًا. ⏱ نحو 26 دقيقة.
- تحسب مؤشّراتٍ تلخّص البيانات.
- تستخدم
max/minمعkeyلاختيار العناصر لا الأرقام. - ترتّب وترشّح البيانات بخوارزميّات 101.
- تحوّل التحليل إلى معرفةٍ تقترب من القرار.
١من البيانات النظيفة إلى المعرفة
معنا الآن بياناتٌ نظيفة. التحليل يحوّلها إلى معرفةٍ تقود القرار: مَن الأعلى؟ مَن دون المتوسّط؟ ما حال الصفّ عمومًا؟ نستخدم الخوارزميّات التي تعلّمتها في 101 — الحساب والتجميع والترتيب والبحث — على بياناتنا.
أوّلًا: متوسّط درجات كل طالبٍ (من درجاته الموجودة):
students = [ {"name": "سعود", "grades": [70, 65, 80], "attendance": 0.9}, {"name": "نورة", "grades": [55, 40, 60], "attendance": 0.6}, {"name": "خالد", "grades": [90, 85, 88], "attendance": 0.95}, {"name": "ريم", "grades": [50, 45], "attendance": 0.5}, {"name": "فهد", "grades": [60, 62], "attendance": 0.8},] for s in students: avg = round(sum(s["grades"]) / len(s["grades"]), 1) s["avg"] = avg # نحفظه للاستخدام لاحقًا print(f'{s["name"]}: {avg}')
٢التجميع: إحصاءات الصفّ
نلخّص الصفّ كلّه بمؤشّراتٍ قليلة: المتوسّط العامّ، وأعلى وأدنى طالب. max وmin مع key يختاران الطالب لا الرقم فقط:
students = [ {"name": "سعود", "grades": [70, 65, 80], "attendance": 0.9}, {"name": "نورة", "grades": [55, 40, 60], "attendance": 0.6}, {"name": "خالد", "grades": [90, 85, 88], "attendance": 0.95}, {"name": "ريم", "grades": [50, 45], "attendance": 0.5}, {"name": "فهد", "grades": [60, 62], "attendance": 0.8},] for s in students: s["avg"] = round(sum(s["grades"]) / len(s["grades"]), 1) avgs = [s["avg"] for s in students]print("متوسّط الصفّ:", round(sum(avgs) / len(avgs), 1)) top = max(students, key=lambda s: s["avg"])low = min(students, key=lambda s: s["avg"])print("الأعلى:", top["name"], top["avg"])print("الأدنى:", low["name"], low["avg"])
٣الترتيب والترشيح
الترتيب (101) يرتّب الطلاب بالأداء؛ والترشيح يعزل فئةً تهمّنا — مثل من هم دون 60:
students = [ {"name": "سعود", "grades": [70, 65, 80], "attendance": 0.9}, {"name": "نورة", "grades": [55, 40, 60], "attendance": 0.6}, {"name": "خالد", "grades": [90, 85, 88], "attendance": 0.95}, {"name": "ريم", "grades": [50, 45], "attendance": 0.5}, {"name": "فهد", "grades": [60, 62], "attendance": 0.8},] for s in students: s["avg"] = round(sum(s["grades"]) / len(s["grades"]), 1) ranked = sorted(students, key=lambda s: s["avg"], reverse=True)print("الترتيب:", [s["name"] for s in ranked]) below = [s["name"] for s in students if s["avg"] < 60]print("دون 60:", below)
لاحظ كيف تولّد كل عمليّةٍ معرفةً تقترب من القرار: الترتيب يبرز المتفوّقين، والترشيح يحدّد المرشّحين للدعم — وهو هدف مشروعنا.
توقّع وتحقّق
كيف نحسب متوسّط درجات طالبٍ بعدد درجاتٍ مختلف؟
ما الذي يعيد الطالب صاحب أعلى متوسّطٍ (لا الرقم)؟
كيف نرتّب تنازليًّا؟
ما الذي يعزل الطلاب دون 60؟
الخلاصة
- متوسّط الطالب =
sum(grades)/len(grades)— احترم اختلاف عدد الدرجات. max/minمعkeyيعيدان العنصر كاملًا (الطالب)، لا الرقم.sorted(key=..., reverse=True)يرتّب تنازليًّا بالأداء.- الترشيح يعزل فئة القرار (المرشّحين للدعم).
- كل عمليّةٍ تحليليّةٍ تقرّبنا خطوةً من قرارٍ مبنيٍّ على البيانات.
تحدٍّ برمجي: تحليل أداء الصفّ
متوسّطحلّل البيانات النظيفة: احسب متوسّط كل طالب، ثم اطبع المتوسّط العامّ للصفّ، والترتيب التنازليّ بالأسماء، وقائمة المرشّحين للدعم (دون 60).
- احسب
avgلكل طالبٍ من درجاته الموجودة (مدوّرًا لخانةٍ واحدة). - اطبع
متوسّط الصفّ: .... - اطبع
الترتيب: [...]بالأسماء تنازليًّا. - اطبع
للدعم: [...]لمن متوسّطه دون 60.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
students = [ {"name": "سعود", "grades": [70, 65, 80], "attendance": 0.9}, {"name": "نورة", "grades": [55, 40, 60], "attendance": 0.6}, {"name": "خالد", "grades": [90, 85, 88], "attendance": 0.95}, {"name": "ريم", "grades": [50, 45], "attendance": 0.5}, {"name": "فهد", "grades": [60, 62], "attendance": 0.8},] # أكمل: احسب المتوسّطات، ثم اطبع متوسّط الصفّ والترتيب وقائمة الدعم
💡 تلميح 1
s["avg"] داخل حلقةٍ أولى لتستخدمه مرّاتٍ بعدها.💡 تلميح 2
[s["name"] for s in sorted(students, key=lambda s: s["avg"], reverse=True)].حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
students = [ {"name": "سعود", "grades": [70, 65, 80], "attendance": 0.9}, {"name": "نورة", "grades": [55, 40, 60], "attendance": 0.6}, {"name": "خالد", "grades": [90, 85, 88], "attendance": 0.95}, {"name": "ريم", "grades": [50, 45], "attendance": 0.5}, {"name": "فهد", "grades": [60, 62], "attendance": 0.8},] for s in students: s["avg"] = round(sum(s["grades"]) / len(s["grades"]), 1) avgs = [s["avg"] for s in students]print("متوسّط الصفّ:", round(sum(avgs) / len(avgs), 1)) ranked = sorted(students, key=lambda s: s["avg"], reverse=True)print("الترتيب:", [s["name"] for s in ranked]) print("للدعم:", [s["name"] for s in students if s["avg"] < 60])