الدرس الثامن القواميس في بايثون (Dictionaries) — شرح مبسط للمبتدئين مع أمثلة وتمارين

📘 سلسلة تعلم بايثون — الدرس الثامن

القواميس (Dictionaries) في بايثون: شرح مبسط + أمثلة وتمارين

في هذا الدرس ستتعلم القواميس (Dictionaries) في بايثون: تخزين البيانات على شكل مفتاح/قيمة، وكيفية الإضافة والتعديل والحذف، واستخدام keys و values و items، مع تطبيق عملي وتمارين للمبتدئين والمتوسطين.

✅ سهل للمبتدئين ✅ مفيد للمشاريع ✅ أهم أوامر dict ✅ تمارين + حلول
🧭 فهرس سريع

1) ما هو القاموس (Dictionary) في بايثون؟

القاموس (Dictionary أو dict) هو نوع بيانات يخزّن المعلومات على شكل: مفتاح (Key)قيمة (Value). وهذا يجعل البحث عن البيانات سريعًا جدًا مقارنة بالقوائم في كثير من الحالات.

متى نستخدم dict؟ عندما نريد ربط شيء بشيء: (اسم ↔ عمر)، (مادة ↔ نقطة)، (منتج ↔ سعر)…

مثال بسيط

student = {"name": "أحمد", "age": 15, "city": "الدار البيضاء"}
print(student)

2) إنشاء قاموس وقراءة القيم

نكتب القاموس بين القوسين { }، ونضع كل زوج بالشكل: "key": value

person = {
    "name": "سارة",
    "age": 16
}

print(person["name"])  # سارة
print(person["age"])   # 16

تنبيه: إذا حاولت قراءة مفتاح غير موجود بهذه الطريقة dict["x"] سيظهر خطأ. لهذا غالبًا نستخدم get().

استخدام get لتفادي الأخطاء

print(person.get("name"))
print(person.get("grade"))        # None
print(person.get("grade", 0))     # 0 (قيمة افتراضية)

3) إضافة وتعديل عناصر داخل القاموس

الإضافة والتعديل في dict بسيطة جدًا: نكتب المفتاح ونضع له قيمة.

student = {"name": "أحمد", "age": 15}

student["city"] = "مراكش"   # إضافة
student["age"] = 16         # تعديل

print(student)

معلومة مهمة: إذا كان المفتاح غير موجود سيتم إنشاؤه، وإذا كان موجودًا سيتم تعديل قيمته.


4) حذف عناصر من القاموس

لدينا أكثر من طريقة للحذف، وكل واحدة لها استخدام.

الطريقة ماذا تفعل؟ مثال
del يحذف مفتاحًا (ويُخطئ إذا لم يوجد) del d["age"]
pop() يحذف ويُرجع القيمة d.pop("age")
clear() يمسح القاموس بالكامل d.clear()
d = {"name": "ريم", "age": 17, "city": "فاس"}

removed = d.pop("age")
print("المحذوف:", removed)
print(d)

5) أهم الدوال: keys / values / items / get / update

هذه أهم الأدوات التي تحتاجها مع القواميس:

student = {"name": "أحمد", "age": 15, "city": "طنجة"}

print(student.keys())    # المفاتيح
print(student.values())  # القيم
print(student.items())   # أزواج (key, value)

update لتحديث عدة قيم مرة واحدة

student.update({"age": 16, "city": "الرباط"})
print(student)

لماذا keys/values/items مفيدة؟ لأنها تساعدك على المرور على البيانات بسهولة داخل الحلقات.


6) المرور على القاموس بالحلقات

يمكن المرور على المفاتيح، القيم، أو الاثنين معًا.

المرور على المفاتيح

student = {"name": "سارة", "age": 16}

for key in student:
    print(key)

المرور على القيم

for value in student.values():
    print(value)

المرور على المفتاح والقيمة معًا

for key, value in student.items():
    print(key, "=", value)

أفضل طريقة غالبًا: استخدم items() عندما تحتاج المفتاح والقيمة معًا.


7) قواميس متداخلة (Nested Dictionaries)

يمكن أن يحتوي القاموس على قاموس آخر. هذا مفيد لتمثيل بيانات كثيرة بشكل منظم.

students = {
    "أحمد": {"age": 15, "grade": 17},
    "سارة": {"age": 16, "grade": 18}
}

print(students["أحمد"]["grade"])  # 17

نصيحة: في القواميس المتداخلة حاول دائمًا التحقق من وجود المفاتيح لتفادي الأخطاء.


8) مشروع صغير: دفتر تلاميذ (اسم + نقطة)

مشروع بسيط لكنه قوي جدًا للتعلم، ويمكن أن يجلب زيارات لأنه واقعي ويشبه تطبيقات المدارس. سنخزن النقطة لكل تلميذ داخل قاموس.

grades = {}

while True:
    print("\n1) إضافة/تحديث نقطة")
    print("2) عرض النقاط")
    print("3) البحث عن تلميذ")
    print("4) حذف تلميذ")
    print("5) خروج")

    choice = input("اختر: ")

    if choice == "1":
        name = input("اسم التلميذ: ")
        grade = float(input("النقطة: "))
        grades[name] = grade
        print("تم الحفظ ✅")

    elif choice == "2":
        if len(grades) == 0:
            print("لا توجد بيانات بعد.")
        else:
            for name, grade in grades.items():
                print(name, "=>", grade)

    elif choice == "3":
        name = input("اسم التلميذ للبحث: ")
        g = grades.get(name)
        if g is None:
            print("غير موجود.")
        else:
            print(name, "نقطته:", g)

    elif choice == "4":
        name = input("اسم التلميذ للحذف: ")
        if name in grades:
            grades.pop(name)
            print("تم الحذف ✅")
        else:
            print("غير موجود.")

    elif choice == "5":
        print("إلى اللقاء 👋")
        break
    else:
        print("اختيار غير صحيح")

تطوير للمستوى المتوسط: احسب المعدل العام، وأعلى نقطة، وأقل نقطة، ثم اعرض الترتيب.


9) تمارين (مع حلول)

⭐ تمرين 1: أنشئ قاموسًا يمثل منتجًا (name, price) واطبع السعر.

product = {"name": "Book", "price": 30}
print(product["price"])

⭐ تمرين 2: استعمل get لقراءة مفتاح غير موجود بدون خطأ.

d = {"a": 1}
print(d.get("b", 0))

⭐ تمرين 3 (متوسط): مرّ على القاموس واطبع كل مفتاح وقيمته.

d = {"name": "علي", "age": 20}

for k, v in d.items():
    print(k, "=>", v)

⭐ تمرين 4 (متوسط): احذف مفتاحًا إذا كان موجودًا فقط.

d = {"x": 10, "y": 20}
key = "x"

if key in d:
    d.pop(key)

print(d)

10) أسئلة شائعة (FAQ)

هل يمكن أن يكون المفتاح رقمًا بدل نص؟

نعم، يمكن أن يكون المفتاح رقمًا أو نصًا أو حتى tuple، لكن غالبًا نستخدم نصوصًا لسهولة القراءة.

هل القاموس مرتب دائمًا؟

في الإصدارات الحديثة من بايثون يتم الحفاظ على ترتيب الإدخال، لكن لا تعتمد على ذلك في كل الحالات التعليمية القديمة.

متى أستعمل Dictionary بدل List؟

عندما تريد ربط “مفتاح” بقيمة (مثل اسم ↔ نقطة) والبحث بسرعة باستخدام المفتاح.

التالي في السلسلة:
الدرس التاسع: المجموعات (Sets) في بايثون — عناصر بدون تكرار
⬆️ الرجوع للأعلى

تعليقات

المشاركات الشائعة من هذه المدونة

تربية الأطفال في عصر الذكاء الاصطناعي: دليل الآباء والمربين لتحقيق توازن تربوي آمن

الدرس السادس : شرح Functions في Python بأسلوب مبسط مع أمثلة عملية

كيف نحمي أبناءنا من إدمان الهاتف الذكي؟