cb
codebamin
الفصل 12 · القواميس (Dictionaries)

مقدمة إلى القواميس (Dictionaries)

تعرفنا حتى الآن على عدة أنواع: str وint وfloat وbool وlist. النوع الوحيد من بينها الذي يستطيع احتواء عدة قيم هو list.

الآن سنتعلم نوعًا آخر من الحاويات هو dict، اختصار dictionary، أي القاموس.

فكّر في القاموس المعتاد الذي تبحث فيه عن كلمة لتحصل على تعريفها أو ترجمتها. قواميس بايثون تعمل بفكرة مشابهة لكن بصورة أعم: تبحث باستخدام مفتاح (key) لتحصل على القيمة (value) المرتبطة به.

هذا مثال لقاموس صغير يترجم كلمات إنجليزية إلى الفرنسية:

__program_indented__

شغّل السطر السابق في الطرفية.

المتغير french قاموس يحتوي على زوجين من المفتاح والقيمة:

  • 'apple': 'pomme'، حيث 'apple' هو المفتاح و'pomme' هي القيمة.
  • 'box': 'boite'، حيث 'box' هو المفتاح و'boite' هي القيمة.

كما في القوائم، تُستخدم الفاصلة , للفصل بين العناصر، أي أزواج المفتاح والقيمة. وتفصل النقطتان : المفتاح عن قيمته. لاحظ أيضًا أن القاموس يُكتب بين الأقواس المعقوفة {} بدل الأقواس المربعة [] الخاصة بالقوائم.

في القائمة تحصل على القيمة باستخدام الفهرس، أي موضع العنصر. فإذا كانت words = ['apple', 'box'] فإن words[0] هي 'apple' وwords[1] هي 'box'.

جرّب الآن مع القاموس:

french[0]

هذا لا يعمل، لأن موضع العنصر داخل القاموس ليس هو الطريقة التي نستخدمها عادة للوصول إلى البيانات. لا يهمك أن تعرف «الكلمة الثانية» أو «الكلمة الخامسة» بقدر ما يهمك البحث عن مفتاح محدد مثل 'apple'.

جرّب إذن:

french['apple']

أفضل!

اكتب الآن سطرًا مشابهًا في الطرفية للحصول على ترجمة 'box' من القاموس.

والآن أصبحت تعرف بايثون والفرنسية معًا!

جرّب الآن عكس اتجاه البحث بهذه الطريقة:

french['pomme']

وفكّر قبل التنفيذ: هل 'pomme' مفتاح في القاموس أم قيمة؟ القاموس يبحث باستخدام المفاتيح فقط.

لا يمكن إجراء البحث بهذه الطريقة أيضًا. القاموس يسمح لك باستخدام المفتاح للحصول على قيمته، ولا يوفر بحثًا عكسيًا مباشرًا من القيمة إلى المفتاح. القاموس french لديه مفتاحان فقط: 'apple' و'box'. أما 'pomme' فهي قيمة وليست مفتاحًا. سنتعلم قريبًا لماذا لا يمكن الاعتماد على البحث العكسي بهذه الصورة وما البدائل المتاحة.

لاحظ أن french[0] وfrench['pomme'] أدّيا إلى النوع نفسه من الخطأ: KeyError. هذا يعني أن المفتاح المطلوب، سواء كان 0 أو 'pomme'، غير موجود في القاموس. ليست المشكلة أن استخدام french[0] ممنوع؛ معناه ببساطة «ابحث عن القيمة المرتبطة بالمفتاح 0»، ولم يوجد مثل هذا المفتاح. ويمكن للعدد 0 أن يكون مفتاحًا فعلًا في قاموس آخر، لأن بايثون يسمح بأنواع متعددة من المفاتيح، منها النصوص والأعداد.

solution.py
1
2
3
4
5
6
7
8
9
10
الطرفية (shell)
>>>