تخطَّ إلى المحتوى

القواميس في Python (Dictionaries)

الدرس 13 من 25 · Python

القوائم ممتازة لحفظ أشياء مرتبة، لكنك تصل إليها بأرقام: students[0] و students[1]. ماذا لو أردت أن تصل إلى المعلومة باسمها؟ مثل «ما عمر منى؟» أو «كم سعر الشاي؟». في هذا الدرس ستتعلم القواميس (Dictionaries)، وهي من أقوى أدوات Python وأكثرها استخداماً.

القاموس يحفظ البيانات على شكل أزواج: مفتاح وقيمة. تخيّل قاموس اللغة الحقيقي: تبحث عن الكلمة (المفتاح) فتجد معناها (القيمة). ولا تقرأ القاموس من أوله، بل تذهب مباشرة إلى الكلمة.

student = {"name": "منى", "age": 14, "city": "طنطا"}
print(student)
الناتج
{'name': 'منى', 'age': 14, 'city': 'طنطا'}

القاموس يُكتب بين قوسين معقوفين { }، وكل عنصر فيه مكتوب على شكل مفتاح: قيمة، وبين العناصر فواصل. المفاتيح غالباً نصوص، والقيم يمكن أن تكون من أي نوع.

تكتب المفتاح بين قوسين مربعين:

print(student["name"])
الناتج
منى

لكن ماذا لو طلبت مفتاحاً غير موجود؟

print(student["phone"])
الناتج
KeyError: 'phone'

الدالة get: القراءة الآمنة

Section titled “الدالة get: القراءة الآمنة”

الدالة get لا تسبب خطأ إذا لم يكن المفتاح موجوداً، بل تُرجع None، أو قيمة افتراضية تحددها أنت:

print(student.get("phone"))
print(student.get("phone", "غير مسجل"))
الناتج
None
غير مسجل

التعديل والإضافة والحذف

Section titled “التعديل والإضافة والحذف”
student["age"] = 15 # تعديل قيمة موجودة
student["school"] = "مدرسة النور" # إضافة مفتاح جديد
del student["city"] # حذف مفتاح
print(student)
print(len(student))
print("name" in student)
الناتج
{'name': 'منى', 'age': 15, 'school': 'مدرسة النور'}
3
True

لاحظ أن التعديل والإضافة يُكتبان بنفس الطريقة: إذا كان المفتاح موجوداً تتغير قيمته، وإذا لم يكن موجوداً يُضاف. والكلمة in تبحث في المفاتيح.

prices = {"شاي": 10, "قهوة": 25}
for item in prices:
print(item)
for item, price in prices.items():
print(f"{item}: {price} جنيه")
الناتج
شاي
قهوة
شاي: 10 جنيه
قهوة: 25 جنيه
  • المرور المباشر على القاموس يعطيك المفاتيح.
  • الدالة items() تعطيك المفتاح والقيمة معاً في كل دورة. وهي الطريقة الأكثر استخداماً.

ويمكنك الحصول على المفاتيح أو القيم وحدها:

print(list(prices.keys()))
print(list(prices.values()))
الناتج
['شاي', 'قهوة']
[10, 25]

مثال عملي: عدّ تكرار الكلمات

Section titled “مثال عملي: عدّ تكرار الكلمات”

هذا مثال كلاسيكي يوضح قوة القواميس: كم مرة تكررت كل كلمة في نص؟

text = "تفاح موز تفاح عنب موز تفاح"
counts = {}
for word in text.split():
counts[word] = counts.get(word, 0) + 1
print(counts)
الناتج
{'تفاح': 3, 'موز': 2, 'عنب': 1}

في كل دورة: نقرأ العدد الحالي للكلمة بـ get (أو صفر إذا كانت أول مرة)، ونزيده واحداً. خمسة أسطر فقط لحل مشكلة حقيقية!

في البرامج الحقيقية، ستجد كثيراً قائمة كل عنصر فيها قاموس، مثل قائمة منتجات:

products = [
{"name": "قلم", "price": 5},
{"name": "حقيبة", "price": 120},
]
for p in products:
print(p["name"], p["price"])
الناتج
قلم 5
حقيبة 120

هذا الشكل يشبه تماماً البيانات التي تأتي من المواقع والتطبيقات بصيغة JSON.

اكتب برنامج «دفتر هاتف» صغيراً:

  1. أنشئ قاموساً فيه اسمان وأرقام هواتفهما.
  2. أضف اسماً ثالثاً.
  3. اسأل المستخدم عن اسم، واطبع رقمه إن كان موجوداً، أو «غير موجود في الدفتر» إن لم يكن.

مثال على التشغيل:

الناتج
عن من تبحث؟ سارة
رقم سارة: 01012345678

تلميح: استخدم get مع قيمة افتراضية، أو افحص بـ in.

  • KeyError: قراءة مفتاح غير موجود بالأقواس المربعة. استخدم get أو افحص بـ in أولاً.
  • الخلط بين المفتاح والقيمة في البحث: "منى" in student تبحث في المفاتيح وليس في القيم، فتعطي False.
  • نسيان علامات التنصيص حول المفتاح: student[name] تبحث عن متغير اسمه name. الصحيح student["name"].

سؤال

إذا كان d = {'a': 1}، فما ناتج d.get('b', 0)؟

سؤال

ما الدالة التي تعطيك المفتاح والقيمة معاً في الحلقة؟

  • القاموس يحفظ أزواج مفتاح: قيمة بين { }، وتصل للقيمة بمفتاحها.
  • d["key"] تسبب KeyError إذا لم يوجد المفتاح، و d.get("key", افتراضي) آمنة.
  • الإسناد d["key"] = قيمة يعدّل أو يضيف، و del تحذف.
  • for key, value in d.items(): للمرور على المفاتيح والقيم معاً.
  • قوائم القواميس شكل شائع جداً لتمثيل البيانات.