Lesson 11
قواميس
1. قواميس
عادة ما تكون القوائم العادية (المصفوفات) عبارة عن مجموعة من العناصر المرقمة ، لذلك إذا كنت تريد إنشاء مرجع إلى أي عنصر قائمة ، يجب عليك تحديد رقمه. يحدد عدد العناصر في القائمة البند نفسه بشكل فريد. لكن أرقام التعريف ليست مريحة دائمًا. على سبيل المثال ، تستخدم طرق القطارات في روسيا الحروف والأرقام كرمز تعريف (رقم ورقم واحد) ، كما يحدد كود أبجدي رقمي الرحلات ، بمعنى أنه يجب تخزين معلومات حول الرحلات الجوية أو القطارات أو أرقام الطائرات ليس كرقم ولكن سلسلة نصية.
تُسمى بنية البيانات ، التي تسمح باستخدام نوع عشوائي من الفهرس بدلاً من العدد الرقمي ، القاموس أو الصفيف الترابطية . ويطلق على بنية البيانات المناظرة في بيثون dict
.
فكر في مثال بسيط. احصل على قاموس Capitals
، حيث يكون الفهرس هو اسم البلد ، والقيمة - اسم عاصمة هذا البلد. الآن على التوالي مع اسم البلد يمكننا بسهولة تحديد عاصمة لها.
# قم بإنشاء Dict Capital فارغة Capitals = dict() # املأها ببعض القيم Capitals['Russia'] = 'Moscow' Capitals['Ukraine'] = 'Kiev' Capitals['USA'] = 'Washington' Countries = ['Russia', 'France', 'USA', 'Russia'] for country in Countries: # لكل بلد من القائمة تحقق لمعرفة ما إذا كان في قاموس العواصم if country in Capitals: print('The capital of ' + country + ' is ' + Capitals[country]) else: print('The capital of ' + country + ' is unknown')
لذلك ، يتكون كل عنصر من القاموس من كائنين: المفتاح والقيم . في المثال لدينا مفتاح هو اسم البلد والقيمة هي اسم رأس المال. يعرّف المفتاح عنصر القاموس ، القيمة هي البيانات المقابلة للمفتاح المحدد. قيم المفتاح فريدة ، أي لا يمكن أن يوجد مفتاحان متطابقان في القاموس.
نحن معتادون على القواميس من حولنا ، والقواميس الورقية المعتادة (تعريف ، أحادي اللغة ، ثنائية اللغة). بالنسبة لتعريف القاموس ، فإن المفتاح هو الكلمة (عنوان المقالة) ، والقيمة هي المقالة نفسها ، ومن أجل الوصول إلى المقالة ، يجب عليك تحديد الكلمة المفتاحية.
دليل الهاتف هو مثال آخر على بنية بيانات القاموس. في هذه الحالة ، يكون المفتاح هو الاسم والقيمة هو رقم الهاتف. بالنسبة لكل من القاموس ودليل الهاتف ، من السهل العثور على عنصر من القاموس باستخدام مفتاح معين (على سبيل المثال ، إذا تم تخزين السجلات بترتيب أبجدي للمفاتيح ، فيمكنك بسهولة العثور على المفتاح الخاص بك باستخدام بحث ثنائي) ، ولكن إذا كان المفتاح غير معروف ، ونعلم القيمة فقط ، قد يتطلب البحث عن العنصر ذي القيمة المحددة عرضًا متسقًا لكل عناصر القاموس.
إحدى الميزات الهامة للصفيف النقابي هو أنها ديناميكية ، أي يمكنك إضافة عناصر جديدة مع أي مفاتيح وحذف العناصر الموجودة. حجم الذاكرة المستخدمة يتناسب مع حجم الصفيف الترابطية. الوصول إلى عناصر صفيف اقتران أبطأ من المصفوفات العادية ، ولكن لا يزال بسرعة كبيرة.
في بايثون ، يمكن أن يكون المفتاح أي نوع بيانات ثابت (غير قابل للتغيير): الأعداد الصحيحة والأرقام الحقيقية ، السلاسل ، الصفوف. المفتاح في القاموس قد لا تكون مجموعة، ولكن قد يكون عنصرا من نوع frozenset
: نوع بيانات خاص التناظرية من نوع set
التي لا يمكن تعديلها بعد الخلق. يمكن أن تكون قيمة عنصر القاموس أي نوع بيانات ، بما في ذلك قابل للتعديل.
2. تطبيق القواميس
يتم استخدام القواميس في الحالات التالية:
Num['January'] = 1; Num['February'] = 2; ...
يمكن إنشاء قاموس فارغ باستخدام الدالة dict()
أو زوج فارغ من الأقواس المتعرجة {}
(وهذا في الواقع السبب في عدم استخدام الأقواس المتعرجة لإنشاء مجموعة فارغة). لإنشاء قاموس مع مجموعة من القيم الأولية ، يمكنك استخدام الإنشاءات التالية:
Capitals = {'Russia': 'Moscow', 'Ukraine': 'Kiev', 'USA': 'Washington'} Capitals = dict(RA = 'Moscow', Ukraine = 'Kiev', USA = 'Washington') Capitals = dict([("Russia", "Moscow"), ("Ukraine", "Kiev"), ("USA", "Washington")]) Capitals = dict(zip(["Russia", "Ukraine", "USA"], ["Moscow", "Kiev", "Washington"])) print(Capitals)
لا يمكن استخدام الطريقتين الأوليين إلا لإنشاء قواميس صغيرة من خلال سرد جميع عناصرها. بالإضافة إلى ذلك ، في الطريقة الثانية ، يتم تمرير المفاتيح كمعلمات مسماة dict
، لذا في هذه الحالة ، يمكن أن تكون المفاتيح سلاسل فقط ، ومُعرِّفات صحيحة فقط. في الحالتين الثالثة والرابعة ، يمكنك إنشاء قواميس كبيرة ، إذا كانت الحجج المنقولة قائمة جاهزة ، والتي لا يمكن الحصول عليها فقط من خلال إدراج جميع العناصر ، ولكن يتم إنشاؤها بأي طريقة أخرى أثناء تنفيذ البرنامج. في الطريق الثالث وظيفة dict
يحتاج إلى تلقي قائمة حيث كل عنصر هو الصفوف (tuple) من عنصرين: مفتاح وقيمة. تستخدم الطريقة الرابعة وظيفة zip
، والتي تحتاج إلى الحصول على قائمتين متساويتين في الطول: قائمة بالمفاتيح وقائمة القيم.
3. العمل مع عناصر القاموس
العملية الأساسية: الحصول على قيمة العنصر من خلال مفتاحه. هو مكتوب بالضبط مثل القوائم: A[key]
. إذا لم يكن هناك عنصر بمفتاح محدد في القاموس ، فإنه يقوم KeyError
الاستثناء KeyError
.
طريقة أخرى لتعريف القيمة استناداً إلى مفتاح هي طريقة get
: A.get(key)
. إذا كان هناك أي عنصر مع مفتاح get
في القاموس، فإنها ترجع None
. في النموذج مع A.get(key, val)
ترجع طريقة A.get(key, val)
val
، إذا لم يكن العنصر الذي يحتوي على المفتاح key
A.get(key, val)
في القاموس.
لمعرفة ما إذا كان العنصر ينتمي إلى عمليات القاموس in
not in
استخدامها ، كما هو الحال بالنسبة للمجموعات.
لإضافة عنصر جديد إلى القاموس تحتاج فقط إلى تعيينه مع بعض القيمة: A[key] = value
.
لإزالة عنصر من القاموس ، يمكنك استخدام del A[key]
(العملية KeyError
استثناء KeyError
إذا لم يكن هناك مثل هذا المفتاح في القاموس.) فيما يلي طريقتان KeyError
لإزالة عنصر من القاموس.
A = {'ab' : 'ba', 'aa' : 'aa', 'bb' : 'bb', 'ba' : 'ab'} key = 'ac' if key in A: del A[key] try: del A[key] except KeyError: print('There is no element with key "' + key + '" in dict') print(A)
في الحالة الأولى ، نتحقق أولاً من وجود عنصر ، ثم نلتقط الاستثناء ونعالجه.
هناك طريقة أخرى لإزالة عنصر من القاموس وهي الطريقة pop
: A.pop(key)
. تقوم هذه الطريقة بإرجاع قيمة العنصر الذي تمت إزالته وإذا لم يكن العنصر مع المفتاح المحدد موجودًا في القاموس ، فسيتم رفع استثناء. إذا كان pop
الأسلوب يتلقى معلمة ثانية ، فإن العنصر المفقود سوف يعيد قيمة هذه المعلمة. هذا يسمح لتنظيم بأمان إزالة العنصر من القاموس: A.pop(key, None)
.
4. قاموس متكرر
يمكنك بسهولة التكرار من خلال مفاتيح جميع العناصر في القاموس:
A = dict(zip('abcdef', list(range(6)))) for key in A: print(key, A[key])
الطرق التالية ترجع تمثيل عناصر القاموس. تشبه التمثيلات المجموعات ، ولكنها تتغير ، إذا قمت بتغيير قيم العناصر. تقوم keys
الأسلوب بإرجاع تمثيل مفاتيح كافة العناصر ، حيث تقوم values
بإرجاع تمثيل لكافة القيم ، وتقوم items
الأسلوب بإرجاع تمثيل لكافة الأزواج (tuples) للمفاتيح والقيم.
وبالتالي ، لفحص سريع ما إذا كانت قيمة val
هي من بين جميع قيم القاموس A
يجب استخدام val in A.values()
condition val in A.values()
. للتكرار من خلال المفاتيح والمتغيرات ، يمكنك القيام بما يلي:
A = dict(zip('abcdef', list(range(6)))) for key, val in A.items(): print(key, val)