طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 303 · من الفكرة إلى المنتج (٣): بيانات وتنبّؤ
الدرس 3 · الوحدة 2: التحليل والنمذجة

المحطّة ٣: الخوارزميّات والتحليل

حوّل البيانات إلى معرفة: متوسّطاتٌ وترتيبٌ وترشيحٌ يبرز من يحتاج دعمًا. ⏱ نحو 26 دقيقة.

8872615248ترتيبٌ تنازليٌّ للمتوسّطات
بعد هذا الدرس ستستطيع أن:
  • تحسب مؤشّراتٍ تلخّص البيانات.
  • تستخدم max/min مع key لاختيار العناصر لا الأرقام.
  • ترتّب وترشّح البيانات بخوارزميّات 101.
  • تحوّل التحليل إلى معرفةٍ تقترب من القرار.

١من البيانات النظيفة إلى المعرفة

معنا الآن بياناتٌ نظيفة. التحليل يحوّلها إلى معرفةٍ تقود القرار: مَن الأعلى؟ مَن دون المتوسّط؟ ما حال الصفّ عمومًا؟ نستخدم الخوارزميّات التي تعلّمتها في 101 — الحساب والتجميع والترتيب والبحث — على بياناتنا.

أوّلًا: متوسّط درجات كل طالبٍ (من درجاته الموجودة):

main.py
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}')
Shell×
>>> %Run main.py
سعود: 71.7
نورة: 51.7
خالد: 87.7
ريم: 47.5
فهد: 61.0
>>>

٢التجميع: إحصاءات الصفّ

نلخّص الصفّ كلّه بمؤشّراتٍ قليلة: المتوسّط العامّ، وأعلى وأدنى طالب. max وmin مع key يختاران الطالب لا الرقم فقط:

main.py
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"])
Shell×
>>> %Run main.py
متوسّط الصفّ: 63.9
الأعلى: خالد 87.7
الأدنى: ريم 47.5
>>>

٣الترتيب والترشيح

الترتيب (101) يرتّب الطلاب بالأداء؛ والترشيح يعزل فئةً تهمّنا — مثل من هم دون 60:

main.py
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)
Shell×
>>> %Run main.py
الترتيب: ['خالد', 'سعود', 'فهد', 'نورة', 'ريم']
دون 60: ['نورة', 'ريم']
>>>

لاحظ كيف تولّد كل عمليّةٍ معرفةً تقترب من القرار: الترتيب يبرز المتفوّقين، والترشيح يحدّد المرشّحين للدعم — وهو هدف مشروعنا.

توقّع وتحقّق

كيف نحسب متوسّط درجات طالبٍ بعدد درجاتٍ مختلف؟

ما الذي يعيد الطالب صاحب أعلى متوسّطٍ (لا الرقم)؟

كيف نرتّب تنازليًّا؟

ما الذي يعزل الطلاب دون 60؟

الخلاصة

تحدٍّ برمجي: تحليل أداء الصفّ

متوسّط

حلّل البيانات النظيفة: احسب متوسّط كل طالب، ثم اطبع المتوسّط العامّ للصفّ، والترتيب التنازليّ بالأسماء، وقائمة المرشّحين للدعم (دون 60).

المطلوب:
  • احسب avg لكل طالبٍ من درجاته الموجودة (مدوّرًا لخانةٍ واحدة).
  • اطبع متوسّط الصفّ: ....
  • اطبع الترتيب: [...] بالأسماء تنازليًّا.
  • اطبع للدعم: [...] لمن متوسّطه دون 60.

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
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},] # أكمل: احسب المتوسّطات، ثم اطبع متوسّط الصفّ والترتيب وقائمة الدعم
المطلوب×
متوسّط الصفّ: 63.9
الترتيب: ['خالد', 'سعود', 'فهد', 'نورة', 'ريم']
للدعم: ['نورة', 'ريم']
💡 تلميح 1
احفظ المتوسّط في s["avg"] داخل حلقةٍ أولى لتستخدمه مرّاتٍ بعدها.
💡 تلميح 2
الترتيب بالأسماء: [s["name"] for s in sorted(students, key=lambda s: s["avg"], reverse=True)].

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
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])

🐞 لاحظت خطأً في هذا الدرس؟ أبلغني بالبريد

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس