الوحدة 3 • الدرس 10

القواميس (Dictionaries)

تعلم كيفية تخزين البيانات كأزواج من المفاتيح والقيم

⏱️ 25 دقيقة 📊 متوسط 📖 بنية البيانات الأهم

📖 ما هي القواميس؟

القواميس (Dictionaries) هي بنية بيانات تخزن العناصر كأزواج من المفاتيح والقيم. كل مفتاح فريد ويرتبط بقيمة واحدة، مما يجعل البحث سريعاً جداً.

تصور القاموس
"الاسم" "أحمد"
"العمر" 25
"المدينة" "القاهرة"

إنشاء القواميس

Python طرق إنشاء القواميس
# قاموس بسيط
شخص = {"الاسم": "محمد", "العمر": 30}
print(شخص)

# قاموس فارغ
قاموس_فارغ = {}
قاموس_فارغ2 = dict()

# باستخدام dict()
طالب = dict(الاسم="سارة", المعدل=3.8)
print(طالب)

# من قائمة أزواج
أزواج = [("أ", 1), ("ب", 2), ("ج", 3)]
قاموس = dict(أزواج)
print(قاموس)  # {'أ': 1, 'ب': 2, 'ج': 3}

# من مفاتيح مع قيمة افتراضية
مفاتيح = ["س", "ص", "ع"]
إحداثيات = dict.fromkeys(مفاتيح, 0)
print(إحداثيات)  # {'س': 0, 'ص': 0, 'ع': 0}

# قاموس متداخل
شركة = {
    "الاسم": "تك عربي",
    "الموظفين": {
        "مدير": "أحمد",
        "مبرمج": "سارة"
    },
    "المدن": ["القاهرة", "الرياض"]
}

🔍 الوصول إلى القيم

Python قراءة القيم
منتج = {
    "الاسم": "هاتف ذكي",
    "السعر": 2500,
    "الكمية": 50,
    "متوفر": True
}

# الوصول المباشر بالأقواس المربعة
print(منتج["الاسم"])   # هاتف ذكي
print(منتج["السعر"])   # 2500

# استخدام get() - أكثر أماناً
print(منتج.get("الكمية"))        # 50
print(منتج.get("اللون"))         # None (لا يوجد)
print(منتج.get("اللون", "أسود")) # أسود (قيمة افتراضية)

# الفرق المهم:
# منتج["اللون"]  # ❌ KeyError: 'اللون'
# منتج.get("اللون")  # ✅ None

# الوصول للقواميس المتداخلة
شركة = {
    "الموظفين": {
        "مدير": {"الاسم": "أحمد", "الراتب": 10000}
    }
}
print(شركة["الموظفين"]["مدير"]["الاسم"])  # أحمد
💡
نصيحة:

استخدم get() عندما لا تكون متأكداً من وجود المفتاح، لتجنب أخطاء KeyError.

✏️ تعديل القواميس

Python إضافة وتعديل وحذف
سيارة = {"الماركة": "تويوتا", "الموديل": "كامري"}

# إضافة عنصر جديد
سيارة["السنة"] = 2023
سيارة["اللون"] = "أبيض"
print(سيارة)

# تعديل قيمة موجودة
سيارة["اللون"] = "أسود"
print(سيارة["اللون"])  # أسود

# استخدام update() لإضافة عدة عناصر
سيارة.update({"المحرك": "هايبرد", "الأبواب": 4})
print(سيارة)

# حذف عنصر باستخدام del
del سيارة["الأبواب"]

# حذف وإرجاع القيمة باستخدام pop()
اللون = سيارة.pop("اللون")
print(f"تم حذف اللون: {اللون}")

# حذف مع قيمة افتراضية
المكيف = سيارة.pop("المكيف", "غير موجود")
print(المكيف)  # غير موجود

# حذف آخر عنصر
آخر = سيارة.popitem()
print(f"تم حذف: {آخر}")

# مسح جميع العناصر
سيارة.clear()
print(سيارة)  # {}

🔧 دوال القواميس

Python الدوال الأساسية
بيانات = {"أ": 1, "ب": 2, "ج": 3}

# الحصول على المفاتيح
print(بيانات.keys())    # dict_keys(['أ', 'ب', 'ج'])
print(list(بيانات.keys()))  # ['أ', 'ب', 'ج']

# الحصول على القيم
print(بيانات.values())  # dict_values([1, 2, 3])
print(list(بيانات.values()))  # [1, 2, 3]

# الحصول على الأزواج
print(بيانات.items())   # dict_items([('أ', 1), ('ب', 2), ('ج', 3)])

# نسخ القاموس
نسخة = بيانات.copy()
print(نسخة)

# setdefault - إضافة إذا لم يوجد
بيانات.setdefault("د", 4)
print(بيانات)  # {'أ': 1, 'ب': 2, 'ج': 3, 'د': 4}

بيانات.setdefault("أ", 100)  # لن يتغير لأنه موجود
print(بيانات["أ"])  # 1

keys()

تعيد جميع المفاتيح

values()

تعيد جميع القيم

items()

تعيد أزواج (مفتاح، قيمة)

get(key, default)

تعيد القيمة أو الافتراضية

pop(key)

تحذف وتعيد القيمة

update(dict)

تدمج قاموس آخر

🔄 التكرار على القواميس

Python طرق التكرار
علامات = {"رياضيات": 95, "فيزياء": 88, "كيمياء": 92}

# التكرار على المفاتيح (افتراضي)
print("المواد:")
for مادة in علامات:
    print(f"  - {مادة}")

# التكرار على المفاتيح صراحة
for مادة in علامات.keys():
    print(f"{مادة}: {علامات[مادة]}")

# التكرار على القيم
print("العلامات:")
for علامة in علامات.values():
    print(f"  {علامة}")

# التكرار على الأزواج (الأكثر استخداماً)
print("\nجميع البيانات:")
for مادة, علامة in علامات.items():
    if علامة >= 90:
        print(f"✅ {مادة}: {علامة} - ممتاز")
    else:
        print(f"📝 {مادة}: {علامة} - جيد جداً")

# التكرار مع الترقيم
for رقم, (مادة, علامة) in enumerate(علامات.items(), 1):
    print(f"{رقم}. {مادة}: {علامة}")

استيعاب القواميس

مثل استيعاب القوائم، يمكننا إنشاء قواميس بطريقة مختصرة وأنيقة.

Python Dictionary Comprehension
# قاموس المربعات
مربعات = {س: س**2 for س in range(1, 6)}
print(مربعات)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# من قائمتين
أسماء = ["أحمد", "سارة", "محمد"]
أعمار = [25, 30, 28]
بيانات = {اسم: عمر for اسم, عمر in zip(أسماء, أعمار)}
print(بيانات)  # {'أحمد': 25, 'سارة': 30, 'محمد': 28}

# مع شرط
درجات = {"رياضيات": 95, "فيزياء": 78, "كيمياء": 92, "أحياء": 65}
ناجحين = {مادة: درجة for مادة, درجة in درجات.items() if درجة >= 80}
print(ناجحين)  # {'رياضيات': 95, 'كيمياء': 92}

# تحويل القيم
أسعار_دولار = {"قميص": 20, "بنطلون": 35, "حذاء": 50}
سعر_الصرف = 50
أسعار_محلية = {منتج: سعر * سعر_الصرف for منتج, سعر in أسعار_دولار.items()}
print(أسعار_محلية)

# عكس المفاتيح والقيم
أصلي = {"أ": 1, "ب": 2, "ج": 3}
معكوس = {قيمة: مفتاح for مفتاح, قيمة in أصلي.items()}
print(معكوس)  # {1: 'أ', 2: 'ب', 3: 'ج'}

🏗️ القواميس المتداخلة

Python بناء قواميس معقدة
# قاعدة بيانات الطلاب
طلاب = {
    "ط001": {
        "الاسم": "أحمد محمد",
        "العمر": 20,
        "الدرجات": {
            "رياضيات": 95,
            "فيزياء": 88,
            "برمجة": 92
        },
        "النشاطات": ["كرة القدم", "الشطرنج"]
    },
    "ط002": {
        "الاسم": "سارة علي",
        "العمر": 22,
        "الدرجات": {
            "رياضيات": 98,
            "فيزياء": 95,
            "برمجة": 97
        },
        "النشاطات": ["السباحة", "القراءة"]
    }
}

# الوصول للبيانات المتداخلة
print(طلاب["ط001"]["الاسم"])
print(طلاب["ط002"]["الدرجات"]["رياضيات"])

# التكرار على القاموس المتداخل
for رقم, بيانات in طلاب.items():
    print(f"\n{'='*30}")
    print(f"رقم الطالب: {رقم}")
    print(f"الاسم: {بيانات['الاسم']}")

    معدل = sum(بيانات["الدرجات"].values()) / len(بيانات["الدرجات"])
    print(f"المعدل: {معدل:.1f}")

    print("الدرجات:")
    for مادة, درجة in بيانات["الدرجات"].items():
        print(f"  • {مادة}: {درجة}")

# تعديل قيمة متداخلة
طلاب["ط001"]["الدرجات"]["برمجة"] = 95
طلاب["ط001"]["النشاطات"].append("البرمجة")

💼 أمثلة عملية

Python عداد الكلمات
def عد_الكلمات(نص):
    """يحسب تكرار كل كلمة في النص"""
    كلمات = نص.split()
    عداد = {}

    for كلمة in كلمات:
        كلمة = كلمة.lower()
        عداد[كلمة] = عداد.get(كلمة, 0) + 1

    return عداد

نص = "البرمجة ممتعة البرمجة مفيدة تعلم البرمجة"
النتيجة = عد_الكلمات(نص)
print(النتيجة)

# ترتيب حسب التكرار
مرتب = sorted(النتيجة.items(), key=lambda x: x[1], reverse=True)
print("الكلمات الأكثر تكراراً:")
for كلمة, عدد in مرتب:
    print(f"  {كلمة}: {عدد}")
Python نظام إدارة المخزون
مخزون = {}

def إضافة_منتج(الاسم, الكمية, السعر):
    مخزون[الاسم] = {"الكمية": الكمية, "السعر": السعر}
    print(f"✅ تمت إضافة {الاسم}")

def تحديث_كمية(الاسم, الكمية):
    if الاسم in مخزون:
        مخزون[الاسم]["الكمية"] += الكمية
        print(f"✅ تم تحديث كمية {الاسم}")
    else:
        print(f"❌ {الاسم} غير موجود")

def عرض_المخزون():
    print("\n📦 المخزون الحالي:")
    print("-" * 40)
    إجمالي = 0
    for منتج, بيانات in مخزون.items():
        قيمة = بيانات["الكمية"] * بيانات["السعر"]
        إجمالي += قيمة
        print(f"{منتج}: {بيانات['الكمية']} × {بيانات['السعر']} = {قيمة}")
    print("-" * 40)
    print(f"💰 إجمالي القيمة: {إجمالي}")

# الاستخدام
إضافة_منتج("لابتوب", 10, 3000)
إضافة_منتج("فأرة", 50, 100)
إضافة_منتج("لوحة مفاتيح", 30, 200)

تحديث_كمية("لابتوب", 5)
عرض_المخزون()
Python دمج القواميس (Python 3.9+)
# الطريقة القديمة
قاموس1 = {"أ": 1, "ب": 2}
قاموس2 = {"ج": 3, "د": 4}

مدمج = {**قاموس1, **قاموس2}
print(مدمج)  # {'أ': 1, 'ب': 2, 'ج': 3, 'د': 4}

# Python 3.9+ باستخدام |
مدمج2 = قاموس1 | قاموس2
print(مدمج2)

# تحديث في المكان
قاموس1 |= قاموس2
print(قاموس1)

🎯 تحديات تطبيقية

التحدي 1 سهل

دليل الهاتف

أنشئ قاموساً يربط بين الأسماء وأرقام الهواتف، ثم اكتب دالة للبحث عن رقم بالاسم.

# أنشئ دليل الهاتف
# اكتب دالة بحث(الاسم) تعيد الرقم أو "غير موجود"
عرض الحل
دليل_الهاتف = {
    "أحمد": "0501234567",
    "سارة": "0559876543",
    "محمد": "0551112233"
}

def بحث(الاسم):
    return دليل_الهاتف.get(الاسم, "غير موجود")

print(بحث("سارة"))   # 0559876543
print(بحث("علي"))    # غير موجود
التحدي 2 متوسط

تحويل درجات الحرارة

أنشئ قاموساً للمدن ودرجات حرارتها بالسيليزية، ثم أنشئ قاموساً جديداً بالفهرنهايت.

مدن = {"القاهرة": 35, "الرياض": 40, "دبي": 38}
# حول إلى فهرنهايت: F = C × 9/5 + 32
عرض الحل
مدن_سيليزية = {"القاهرة": 35, "الرياض": 40, "دبي": 38}

مدن_فهرنهايت = {
    مدينة: درجة * 9/5 + 32
    for مدينة, درجة in مدن_سيليزية.items()
}

print("درجات الحرارة بالفهرنهايت:")
for مدينة, درجة in مدن_فهرنهايت.items():
    print(f"{مدينة}: {درجة}°F")
التحدي 3 متقدم

نظام تصنيف المنتجات

أنشئ نظاماً يصنف المنتجات حسب الفئات، مع القدرة على إضافة منتجات وعرض فئة معينة.

# المطلوب:
# 1. إنشاء قاموس للفئات والمنتجات
# 2. دالة إضافة_منتج(الفئة, المنتج, السعر)
# 3. دالة عرض_فئة(اسم_الفئة)
عرض الحل
منتجات = {
    "إلكترونيات": [],
    "ملابس": [],
    "أغذية": []
}

def إضافة_منتج(الفئة, المنتج, السعر):
    if الفئة not in منتجات:
        منتجات[الفئة] = []
    منتجات[الفئة].append({"الاسم": المنتج, "السعر": السعر})
    print(f"✅ تمت إضافة {المنتج} إلى {الفئة}")

def عرض_فئة(اسم_الفئة):
    if اسم_الفئة not in منتجات:
        print(f"❌ الفئة {اسم_الفئة} غير موجودة")
        return

    print(f"\n📦 منتجات {اسم_الفئة}:")
    for منتج in منتجات[اسم_الفئة]:
        print(f"  • {منتج['الاسم']}: {منتج['السعر']} ريال")

# الاختبار
إضافة_منتج("إلكترونيات", "هاتف", 3000)
إضافة_منتج("إلكترونيات", "لابتوب", 5000)
إضافة_منتج("ملابس", "قميص", 150)

عرض_فئة("إلكترونيات")