فهم القواميس في Python 3

مقدمة

القاموس هو نوع البيانات المدمج في Python. يقوم القواميس بتعيين المفاتيح إلى القيم وتوفير طريقة مفيدة لتخزين البيانات في Python.

يُستخدم عادة للحفاظ على البيانات ذات الصلة، مثل المعلومات الواردة في معرف أو ملف تعريف المستخدم، يتم بناء القواميس باستخدام الأقواس المجعدة من كلا الجانبين { }.

معلومات: لمتابعة أمثلة الشفرة في هذا البرنامج التعليمي، افتح طرفية Python التفاعلية على نظامك المحلي عن طريق تشغيل الأمر python3. ثم يمكنك نسخ أو لصق أو تحرير الأمثلة عن طريق إضافتها بعد الرمز التفاعلي >>>.

A dictionary looks like this:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

بالإضافة إلى الأقواس المجعدة، هناك أيضًا نقاط التعليم (:) في جميع أنحاء القاموس.

الكلمات على يسار نقاط التعليم هي المفاتيح. المفاتيح يمكن أن تتكون من أي نوع بيانات لا يتغير. المفاتيح في القاموس أعلاه هي:

  • 'اسم_المستخدم'
  • 'متصل'
  • 'المتابعون'

كل مفتاح في المثال أعلاه هو قيمة نصية.

الكلمات على يمين نقاط التعليم هي القيم. يمكن أن تتألف القيم من أي نوع بيانات. القيم في القاموس أعلاه هي:

  • 'sammy-shark'
  • صحيح
  • 987

كل من هذه القيم إما سلسلة نصية، قيمة منطقية، أو عدد صحيح.

لنقم بطباعة القاموس sammy:

print(sammy)
Output
{'username': 'sammy-shark', 'followers': 987, 'online': True}

من خلال النظر إلى الإخراج، قد يكون ترتيب أزواج المفتاح-القيم قد تغير. في إصدارات Python قبل 3.5، نوع بيانات القاموس لا يأتي مرتبًا. ومع ذلك، في إصدارات Python 3.6 وما بعدها، يظل نوع بيانات القاموس مرتبًا. بغض النظر عما إذا كان القاموس مرتبًا أم لا، ستظل أزواج المفتاح-القيم سليمة، مما يتيح لنا الوصول إلى البيانات استنادًا إلى معناها العلاقي.

المتطلبات المسبقة

يجب أن يكون لديك Python 3 مثبتًا وبيئة برمجة معينة على جهاز الكمبيوتر الخاص بك أو الخادم. إذا لم يكن لديك بيئة برمجة معينة، يمكنك الرجوع إلى دليل التثبيت والإعداد لـ بيئة برمجة محلية أو لـ بيئة برمجة على الخادم الخاص بك المناسبة لنظام التشغيل الخاص بك (Ubuntu، CentOS، Debian، إلخ).

الوصول إلى عناصر القاموس

يمكننا استدعاء قيم القاموس عن طريق الإشارة إلى المفاتيح المتعلقة بها.

الوصول إلى عناصر البيانات باستخدام المفاتيح

نظرًا لأن القواميس يقدمون أزواجًا مفتاحية القيمة لتخزين البيانات، يمكن أن تكون عناصر مهمة في برنامج Python الخاص بك.

إذا أردنا عزل اسم المستخدم لـ Sammy، يمكننا القيام بذلك عن طريق استدعاء sammy['username']. دعنا نطبع ذلك:

print(sammy['username'])
Output
sammy-shark

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

من خلال استدعاء المفتاح 'username' نتلقى قيمة هذا المفتاح، والتي هي 'sammy-shark'.

يمكن استدعاء القيم المتبقية في القاموس sammy بنفس الشكل:

sammy['followers']
# ترجع 987

sammy['online']
# ترجع True

من خلال استخدام أزواج مفتاحية القواميس، يمكننا الإشارة إلى المفاتيح لاسترجاع القيم.

استخدام الأساليب للوصول إلى العناصر

بالإضافة إلى استخدام المفاتيح للوصول إلى القيم، يمكننا أيضًا العمل مع بعض الأساليب المدمجة:

  • dict.keys() تعزل المفاتيح
  • dict.values() تعزل القيم
  • dict.items() تعيد العناصر في تنسيق قائمة من أزواج الصفوف (key, value)

للحصول على المفاتيح، سنستخدم الأسلوب dict.keys(). في مثالنا، سيتم استخدام اسم المتغير ويكون sammy.keys(). دعونا نمرر ذلك إلى أسلوب print() وننظر إلى الناتج:

print(sammy.keys())
Output
dict_keys(['followers', 'username', 'online'])

نتلقى ناتج يضع المفاتيح ضمن كائن عرض يمكن التكرار من فئة dict_keys. ثم يتم طباعة المفاتيح ضمن تنسيق قائمة.

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

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
jesse = {'username': 'JOctopus', 'online': False, 'points': 723}

for common_key in sammy.keys() & jesse.keys():
    print(sammy[common_key], jesse[common_key])

القاموس sammy والقاموس jesse هما كل من قاموس ملف تعريف المستخدم.

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

Output
sammy-shark JOctopus True False

يمكننا بالتأكيد تحسين البرنامج لجعل الناتج أكثر قابلية للقراءة من قبل المستخدم، ولكن هذا يوضح أن dict.keys() يمكن استخدامه للتحقق عبر مختلف القواميس لمعرفة ما يتشابه بينها أو ما لا يتشابه. هذا مفيد بشكل خاص للقواميس الكبيرة.

بالمثل، يمكننا استخدام طريقة dict.values() للاستعلام عن القيم في القاموس sammy، والتي ستكون مكونة كما يلي sammy.values(). دعونا نطبع هذه:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

print(sammy.values())
Output
dict_values([True, 'sammy-shark', 987])

كلتا الطريقتين keys() و values() تعيدان قوائم غير مرتبة للمفاتيح والقيم الموجودة في قاموس sammy باستخدام كائنات العرض dict_keys و dict_values على التوالي.

إذا كنا مهتمين بجميع العناصر في قاموس، يمكننا الوصول إليها باستخدام طريقة items():

print(sammy.items())
Output
dict_items([('online', True), ('username', 'sammy-shark'), ('followers', 987)])

التنسيق المُرجَعي لهذا هو قائمة مكونة من أزواج tuples (key، value) مع كائن العرض dict_items.

يمكننا تكرار التنسيق المُرجَعي باستخدام حلقة for. على سبيل المثال، يمكننا طباعة كل من المفاتيح والقيم في قاموس معين، ثم جعله أكثر قابلية للفهم عن طريق إضافة سلسلة نصية:

for key, value in sammy.items():
    print(key, 'is the key for the value', value)
Output
online is the key for the value True followers is the key for the value 987 username is the key for the value sammy-shark

تكرر الحلقة for أعلاه العناصر داخل قاموس sammy وطبعت المفاتيح والقيم سطراً بعد سطر، مع معلومات تجعلها أسهل فهماً للبشر.

يمكننا استخدام الطرق المدمجة للوصول إلى العناصر، القيم، والمفاتيح من هياكل البيانات القاموسية.

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

القواميس هي هيكل بيانات قابل للتعديل، لذا يمكنك تعديلها. في هذا القسم، سنتناول إضافة وحذف عناصر القاموس.

إضافة وتغيير عناصر القاموس

يمكنك إضافة أزواج المفتاح والقيمة إلى القواميس بدون استخدام طريقة أو وظيفة، عن طريق استخدام الصيغة التالية:

dict[key] = value

سنلقي نظرة على كيفية عمل هذا في التطبيق العملي من خلال إضافة زوج المفتاح والقيمة إلى قاموس يُسمى usernames:

usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

usernames['Drew'] = 'squidly'

print(usernames)
Output
{'Drew': 'squidly', 'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

نرى الآن أن القاموس تم تحديثه بزوج المفتاح والقيمة 'Drew': 'squidly'. نظرًا لأن القواميس قد تكون غير مرتبة، قد يحدث هذا الزوج في أي مكان في مخرجات القاموس. إذا استخدمنا القاموس usernames لاحقًا في ملف البرنامج الخاص بنا، فسيتضمن الزوج المفتاح والقيمة الإضافي.

بالإضافة إلى ذلك، يمكن استخدام هذه الصيغة لتعديل القيمة المعينة لمفتاح. في هذه الحالة، سنشير إلى مفتاح موجود ونمرر قيمة مختلفة إليه.

لنفترض أن هناك قاموس drew وهو أحد المستخدمين على الشبكة المعطاة. سنقول إن هذا المستخدم حصل على زيادة في عدد المتابعين اليوم، لذا نحتاج إلى تحديث القيمة الصحيحة الممررة إلى مفتاح 'followers'. سنستخدم وظيفة print() للتحقق من أن القاموس تم تعديله.

drew = {'username': 'squidly', 'online': True, 'followers': 305}

drew['followers'] = 342

print(drew)
Output
{'username': 'squidly', 'followers': 342, 'online': True}

في الناتج، نرى أن عدد المتابعين قفز من القيمة الصحيحة 305 إلى 342.

يمكننا استخدام هذه الطريقة لإضافة أزواج مفتاح-قيمة إلى القواميس مع إدخال المستخدم. لنكتب برنامجًا سريعًا، usernames.py الذي يعمل في سطر الأوامر ويسمح بإدخال من المستخدم لإضافة المزيد من الأسماء وأسماء المستخدمين المرتبطة:

usernames.py
# تعريف القاموس الأصلي
usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

# إعداد حلقة while للتكرار
while True:

    # طلب من المستخدم إدخال اسم
    print('Enter a name:')

    # تعيينه إلى متغير الاسم
    name = input()

    # التحقق مما إذا كان الاسم موجودًا في القاموس وطباعة رد الفعل
    if name in usernames:
        print(usernames[name] + ' is the username of ' + name)

    # إذا كان الاسم غير موجود في القاموس...
    else:

        # تقديم رد فعل        
        print('I don\'t have ' + name + '\'s username, what is it?')

        # استقبال اسم مستخدم جديد للمرتبطة بالاسم
        username = input()

        # تعيين قيمة اسم المستخدم إلى مفتاح الاسم
        usernames[name] = username

        # طباعة رد فعل بأن البيانات تم تحديثها
        print('Data updated.')

لنقم بتشغيل البرنامج في سطر الأوامر:

  1. python usernames.py

عند تشغيل البرنامج، سنحصل على شيء مشابه للإخراج التالي:

Output
Enter a name: Sammy sammy-shark is the username of Sammy Enter a name: Jesse I don't have Jesse's username, what is it? JOctopus Data updated. Enter a name:

عندما ننتهي من اختبار البرنامج، يمكننا الضغط على CTRL + C للخروج من البرنامج. يمكنك تهيئة مشغل لإنهاء البرنامج (مثل كتابة الحرف q) باستخدام بيان شرطي لتحسين الشفرة.

يوضح ذلك كيف يمكنك تعديل القواميس تفاعليًا. مع هذا البرنامج بشكل خاص، فور خروجك من البرنامج باستخدام CTRL + C، ستفقد كل بياناتك ما لم تنفذ طريقة لـ معالجة قراءة وكتابة الملفات.

يمكننا أيضًا إضافة وتعديل القواميس باستخدام طريقة dict.update(). هذا يختلف عن الطريقة append() المتاحة في القوائم.

في القاموس jesse أدناه، دعونا نضيف المفتاح 'followers' ونعطيه قيمة صحيحة بـ jesse.update(). بعد ذلك، دعونا print() القاموس المُحدّث.

jesse = {'username': 'JOctopus', 'online': False, 'points': 723}

jesse.update({'followers': 481})

print(jesse)
Output
{'followers': 481, 'username': 'JOctopus', 'points': 723, 'online': False}

من الإخراج، يمكننا أن نرى أننا أضفنا بنجاح زوج المفتاح-القيمة 'followers': 481 إلى القاموس jesse.

يمكننا أيضًا استخدام طريقة dict.update() لتعديل زوج المفتاح-القيمة الحالي عن طريق استبدال قيمة معينة لمفتاح محدد.

لنقم بتغيير حالة الاتصال عبر الإنترنت لـ Sammy من True إلى False في القاموس sammy:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

sammy.update({'online': False})

print(sammy)
Output
{'username': 'sammy-shark', 'followers': 987, 'online': False}

السطر sammy.update({'online': False}) يشير إلى المفتاح الموجود 'online' ويعدل قيمته البولية من True إلى False. عندما نقوم بالاستدعاء إلى print() القاموس، نرى أن التحديث يحدث في الناتج.

لإضافة عناصر إلى القواميس أو تعديل القيم، يمكننا استخدام إما بنية dict[key] = value أو الطريقة dict.update().

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

كما يمكنك إضافة أزواج المفتاح-القيمة وتغيير القيم داخل نوع البيانات القاموسي، يمكنك أيضًا حذف العناصر داخل القاموس.

لإزالة زوج مفتاح-قيمة من القاموس، سنستخدم البنية النحوية التالية:

del dict[key]

لنأخذ القاموس jesse الذي يمثل أحد المستخدمين. سنقول أن جيسي لم يعد يستخدم المنصة عبر الإنترنت للعب الألعاب، لذا سنقوم بإزالة العنصر المرتبط بمفتاح 'points'. ثم، سنقوم بطباعة القاموس للتأكد من حذف العنصر:

jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}

del jesse['points']

print(jesse)
Output
{'online': False, 'username': 'JOctopus', 'followers': 481}

السطر del jesse['points'] يزيل زوج المفتاح-القيمة 'points': 723 من القاموس jesse.

إذا كنا نرغب في مسح القاموس من جميع قيمه، يمكننا القيام بذلك باستخدام الطريقة dict.clear(). سيحتفظ هذا بالقاموس المعطى في حالة احتياجنا إليه لاحقًا في البرنامج، ولكنه لن يحتوي على أي عناصر بعد الآن.

لنقم بإزالة جميع العناصر داخل القاموس jesse:

jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}

jesse.clear()

print(jesse)
Output
{}

الناتج يظهر أن لدينا الآن قاموس فارغ خالي من أزواج المفتاح والقيم.

إذا لم نعد بحاجة إلى قاموس معين، يمكننا استخدام del للتخلص منه تمامًا:

del jesse

print(jesse)

عند تشغيل استدعاء لـ print() بعد حذف قاموس jesse، سنتلقى الخطأ التالي:

Output
... NameError: name 'jesse' is not defined

بسبب أن القواميس هي أنواع بيانات قابلة للتغيير، يمكن إضافة عناصر إليها وتعديلها، ويمكن إزالة العناصر ومسحها.

الاستنتاج

قام هذا البرنامج التعليمي عبر هيكل البيانات القاموس في لغة Python. القواميس مكونة من أزواج المفتاح والقيم وتوفر وسيلة لتخزين البيانات دون الاعتماد على الترقيم. يتيح ذلك لنا استرداد القيم استنادًا إلى معناها وعلاقتها بأنواع البيانات الأخرى.

يمكنك الآن معرفة المزيد عن أنواع البيانات الأخرى في برنامجنا التعليمي “فهم أنواع البيانات“.

يمكنك رؤية نوع البيانات القاموس المستخدم في مشاريع البرمجة مثل جمع البيانات من الويب باستخدام Scrapy.

Source:
https://www.digitalocean.com/community/tutorials/understanding-dictionaries-in-python-3