القواميس في بايثون (Dictionaries)

تخيل أن لديك دليل هاتف: تبحث عن اسم شخص وتحصل على رقم هاتفه. هذا بالضبط ما تفعله القواميس في بايثون. القواميس (Dictionaries) تخزن البيانات على شكل أزواج من المفتاح والقيمة (Key-Value Pairs)، مما يجعل الوصول للبيانات سريعاً وبديهياً.

القواميس هي من أكثر هياكل البيانات استخداماً في بايثون. تجدها في قراءة ملفات JSON، تخزين إعدادات البرنامج، تمثيل الكائنات، وغيرها الكثير.

1. ما هي القواميس؟

القاموس (Dictionary) هو مجموعة غير مرتبة من أزواج المفتاح-القيمة. كل مفتاح فريد ويرتبط بقيمة واحدة.

الخاصية الوصف
الرمز {} أو dict()
المفاتيح فريدة وغير قابلة للتعديل (strings, numbers, tuples)
القيم أي نوع ويمكن تكرارها
قابلية التعديل نعم (Mutable)

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

create_dicts.py
# قاموس فارغ
empty_dict = {}

# قاموس بسيط
person = {
    "name": "أحمد",
    "age": 25,
    "city": "القاهرة"
}

# قاموس متعدد الأنواع
mixed = {
    "string_key": "قيمة نصية",
    42: "مفتاح رقمي",
    (1, 2): "مفتاح tuple"
}

# قاموس متداخل
student = {
    "name": "سارة",
    "grades": {
        "math": 95,
        "science": 88,
        "arabic": 92
    }
}

# إنشاء باستخدام dict()
another = dict(name="محمد", age=30)

print(f"شخص: {person}")
print(f"طالب متداخل: {student}")
print(f"باستخدام dict(): {another}")

3. الوصول للقيم

access_values.py
person = {"name": "أحمد", "age": 25, "city": "القاهرة"}

# الوصول بالمفتاح
print(f"الاسم: {person['name']}")
print(f"العمر: {person['age']}")

# استخدام get() (أكثر أماناً)
print(f"المدينة: {person.get('city')}")
print(f"الوظيفة: {person.get('job', 'غير محدد')}")  # قيمة افتراضية

# الوصول لقاموس متداخل
student = {
    "name": "سارة",
    "grades": {"math": 95, "science": 88}
}
print(f"\nدرجة الرياضيات: {student['grades']['math']}")
النتيجة
الاسم: أحمد العمر: 25 المدينة: القاهرة الوظيفة: غير محدد درجة الرياضيات: 95
نصيحة: استخدم get() بدلاً من [] عندما لا تكون متأكداً من وجود المفتاح. يتجنب KeyError ويرجع None أو قيمة افتراضية.

4. تعديل القواميس

modify_dicts.py
person = {"name": "أحمد", "age": 25}
print(f"الأصلي: {person}")

# إضافة عنصر
person["city"] = "القاهرة"
print(f"بعد الإضافة: {person}")

# تعديل قيمة
person["age"] = 26
print(f"بعد التعديل: {person}")

# إضافة عدة عناصر
person.update({"job": "مبرمج", "skill": "Python"})
print(f"بعد update: {person}")

# حذف عنصر
del person["skill"]
print(f"بعد del: {person}")

# حذف مع إرجاع القيمة
job = person.pop("job")
print(f"تم حذف: {job}")
print(f"النتيجة: {person}")

# مسح كل العناصر
# person.clear()
النتيجة
الأصلي: {'name': 'أحمد', 'age': 25} بعد الإضافة: {'name': 'أحمد', 'age': 25, 'city': 'القاهرة'} بعد التعديل: {'name': 'أحمد', 'age': 26, 'city': 'القاهرة'} بعد update: {'name': 'أحمد', 'age': 26, 'city': 'القاهرة', 'job': 'مبرمج', 'skill': 'Python'} بعد del: {'name': 'أحمد', 'age': 26, 'city': 'القاهرة', 'job': 'مبرمج'} تم حذف: مبرمج النتيجة: {'name': 'أحمد', 'age': 26, 'city': 'القاهرة'}

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

iterate_dicts.py
person = {"name": "أحمد", "age": 25, "city": "القاهرة"}

# التكرار على المفاتيح
print("=== المفاتيح ===")
for key in person:  # أو person.keys()
    print(f"  {key}")

# التكرار على القيم
print("\n=== القيم ===")
for value in person.values():
    print(f"  {value}")

# التكرار على المفاتيح والقيم معاً
print("\n=== المفاتيح والقيم ===")
for key, value in person.items():
    print(f"  {key}: {value}")
النتيجة
=== المفاتيح === name age city === القيم === أحمد 25 القاهرة === المفاتيح والقيم === name: أحمد age: 25 city: القاهرة

6. Dictionary Comprehension

dict_comprehension.py
# إنشاء قاموس المربعات
squares = {x: x**2 for x in range(1, 6)}
print(f"المربعات: {squares}")

# تصفية قاموس
grades = {"أحمد": 85, "سارة": 92, "محمد": 58, "فاطمة": 78}
passing = {name: grade for name, grade in grades.items() if grade >= 60}
print(f"الناجحون: {passing}")

7. تطبيق عملي: دليل جهات الاتصال

contacts_app.py
contacts = {}

def add_contact(name, phone):
    contacts[name] = phone
    print(f"[+] تمت إضافة {name}")

def show_contacts():
    print("\n" + "=" * 30)
    print("      دليل جهات الاتصال")
    print("=" * 30)
    for name, phone in contacts.items():
        print(f"  {name}: {phone}")
    print("=" * 30)

def search(name):
    if name in contacts:
        print(f"[i] {name}: {contacts[name]}")
    else:
        print(f"[!] '{name}' غير موجود")

# استخدام النظام
add_contact("أحمد", "0501234567")
add_contact("سارة", "0559876543")
add_contact("محمد", "0561112223")

show_contacts()
search("سارة")
search("علي")

8. أفضل الممارسات

افعل
  • استخدم get() للوصول الآمن
  • استخدم items() للتكرار
  • اختر مفاتيح وصفية ومعبرة
  • استخدم Dict Comprehension عند الإمكان
لا تفعل
  • لا تستخدم قوائم كمفاتيح (غير مسموح)
  • لا تفترض ترتيباً معيناً قبل Python 3.7
  • لا تعدل القاموس أثناء التكرار
ملخص الدرس
  • القواميس تخزن أزواج مفتاح-قيمة
  • المفاتيح فريدة وغير قابلة للتعديل
  • get() للوصول الآمن مع قيمة افتراضية
  • items() للتكرار على المفاتيح والقيم

الخطوة التالية

تعلم المجموعات (Sets) للعناصر الفريدة

الدرس التالي: المجموعات (Sets)
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن