كيف ومتى يجب عليك استخدام Defaultdict في Python؟
نشرت: 2022-10-06في هذا البرنامج التعليمي ، ستتعلم كيفية استخدام الإملاء الافتراضي من وحدة مجموعات Python - للتعامل مع KeyErrors بشكل أفضل - عند العمل مع قواميس Python.
في Python ، القاموس عبارة عن بنية بيانات مضمنة قوية تخزن البيانات في أزواج مفتاح - قيمة. ستستخدم المفاتيح للنقر على القاموس والوصول إلى القيم.
ومع ذلك ، عندما يكون لديك قواميس متعددة في نص Python الذي تم تعديله أثناء تنفيذ التعليمات البرمجية ، فغالبًا ما ستواجه KeyErrors. وهناك عدة طرق مختلفة يمكنك من خلالها التعامل معها.
ستتعلم في هذا البرنامج التعليمي:
- ما هي KeyErrors ولماذا تنشأ
- كيفية التعامل مع KeyErrors
- كيفية استخدام لغة Python الافتراضية ، وهي فئة فرعية ترث من فئة Dict المضمنة ، للتعامل مع المفاتيح المفقودة بشكل أفضل
هيا نبدأ!
ما هي أخطاء KeyErors في بايثون؟

عند تحديد قاموس Python ، يجب أن تحرص على التأكد مما يلي:
- يجب أن تكون المفاتيح فريدة - دون أي تكرار.
- عند استخدام تكرارات موجودة كمفاتيح لقاموس ، يجب أن تفضل استخدام مجموعة غير قابلة للتغيير مثل المجموعة.
لذا فإن المفتاح يكون صالحًا فقط إذا كان موجودًا في القاموس ؛ وإلا فإنه يؤدي إلى KeyErrors.
ضع في اعتبارك القاموس التالي ، books_authors
، حيث تكون المفاتيح عبارة عن أسماء الكتب والقيم هي أسماء المؤلفين.
يمكنك كتابة التعليمات البرمجية مع هذا البرنامج التعليمي في Python REPL.
books_authors = { 'Deep Work':'Cal Newport', 'Hyperfocus':'Chris Bailey', 'Pivot':'Jenny Blake', 'The Happiness Equation':'Neil Pasricha' }
يمكنك استخدام المفتاح (اسم الكتاب) للوصول إلى اسم المؤلف.
books_authors['Hyperfocus'] 'Chris Bailey'
للوصول إلى جميع أزواج المفتاح والقيمة في القاموس ، يمكنك استدعاء طريقة items()
في كائن القاموس ، كما هو موضح أدناه:
for book,author in books_authors.items(): print(f"'{book}' by {author}")
'Deep Work' by Cal Newport 'Hyperfocus' by Chris Bailey 'Pivot' by Jenny Blake 'The Happiness Equation' by Neil Pasricha
إذا حاولت الوصول إلى قيمة مفتاح غير موجود في القاموس ، فإن مترجم Python يرفع خطأ KeyError. نواجه KeyError عندما نحاول الوصول إلى قيمة المفاتيح غير الموجودة ، وهي "Grit" و "المفتاح غير الموجود".
books_authors['Grit']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-6-e1a4486f5ced> in <module> ----> 1 books_authors['Grit'] KeyError: 'Grit'
books_authors['non-existent-key']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-7-a3efd56f69e5> in <module> ----> 1 books_authors['non-existent-key'] KeyError: 'non-existent-key'
إذن كيف تتعامل مع KeyErrors في Python؟
هناك طرق قليلة للقيام بذلك ، وسوف نتعلمها في القسم التالي.
كيفية التعامل مع KeyErrors في بايثون

دعنا نتعلم كيفية التعامل مع KeyErrors باستخدام:
- العبارات الشرطية If-else
- حاول باستثناء الكتل
- طريقة القاموس
.get()
# 1. استخدام العبارات الشرطية If-Else
واحدة من أبسط الطرق للتعامل مع KeyErrors في Python هي استخدام العبارات الشرطية if-else.
في بايثون ، تحتوي عبارات if-else على النحو العام التالي:
if condition: # do this else: # do something else
- إذا كان الشرط
True
، فسيتم تنفيذ العبارات الموجودة فيif
body ، و - إذا كان الشرط
False
، فسيتم تنفيذ العبارات الموجودة في نصelse
.
في هذا المثال ، الشرط هو التحقق مما إذا كان المفتاح موجودًا في القاموس.
إذا كان المفتاح موجودًا in
القاموس ، فسيعيد عامل التشغيل " True
" ، وإذا تم تنفيذ النص ، فسيتم طباعة القيمة المقابلة.
key = 'The Happiness Equation' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Neil Pasricha
إذا كان المفتاح غير موجود في القاموس ، فإن عامل التشغيل in
إرجاع False
وسيتم تنفيذ النص else
. يقوم بطباعة رسالة مفادها أن المفتاح غير موجود.
key = 'non-existent-key' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Sorry, this key does not exist!
# 2. استخدام عبارات الاستثناءات التجريبية

هناك طريقة أخرى شائعة للتعامل مع KeyError وهي استخدام عبارات try-except في بايثون.
اقرأ من خلال كتلة التعليمات البرمجية التالية:
key = 'non-existent-key' try: print(books_authors[key]) except KeyError: print('Sorry, this key does not exist!')
- تحاول كتلة try استرداد القيمة المقابلة للمفتاح المقدم.
- إذا لم يكن المفتاح موجودًا ، يقوم المترجم بإصدار KeyError والذي يتم التعامل معه كاستثناء داخل كتلة الاستثناء.
# 3. استخدام طريقة .get ()
في Python ، يمكنك استخدام طريقة القاموس المضمنة .get () للتعامل مع المفاتيح المفقودة.
الصيغة العامة لاستخدام طريقة
get()
هيdict.get(key,default_value)
حيث يكونdict
كائن قاموس صالح في بايثون.- إذا كان المفتاح موجودًا في القاموس ، فإن طريقة
get()
ترجع القيمة.
- عدا ذلك ، تقوم بإرجاع القيمة الافتراضية.
في هذا المثال ، keys
هي قائمة بالمفاتيح التي نرغب في الوصول إلى قيمها. نقوم بإجراء حلقة من خلال قائمة المفاتيح لاسترداد القيم المقابلة من قاموس books_authors
.
هنا ، استخدمنا طريقة .get () مع "غير موجود" كقيمة افتراضية.
keys = ['Grit','Hyperfocus','Make Time','Deep Work'] for key in keys: print(books_authors.get(key,'Does not exist'))
في الكود أعلاه:

- بالنسبة للمفاتيح الموجودة في قاموس
books_authors
، تقوم طريقة.get()
بإرجاع القيم المقابلة. - في حالة عدم وجود المفاتيح ، في هذه الحالة ، "Grit" و "Make Time" ، تُرجع طريقة .get () القيمة الافتراضية "غير موجود".
# Output Does not exist Chris Bailey Does not exist Cal Newport
تساعدنا جميع الطرق المذكورة أعلاه في معالجة الأخطاء الرئيسية. ومع ذلك ، فهي مطولة وتتطلب منا التعامل صراحةً مع المفاتيح المفقودة. يمكنك تبسيط هذه العملية باستخدام صيغة افتراضية بدلاً من قاموس عادي.
الافتراضي في بايثون

الافتراضي هو فئة فرعية من فئة القاموس ( dict
). لذلك فهو يرث سلوك قاموس بايثون. بالإضافة إلى ذلك ، فإنه يتعامل أيضًا مع المفاتيح المفقودة محليًا.
الافتراضي هو نوع بيانات الحاوية الذي تم تضمينه في مكتبة Python القياسية - داخل وحدة collections
.
لذلك عليك استيراده إلى بيئة العمل الخاصة بك:
from collections import defaultdict
إليك الصيغة العامة لاستخدام defaultdict
:
defaultdict(default_factory)
يمكنك تحديد استدعاء مثل int أو float أو list default_factory
. إذا لم تقدم قيمة لـ default_factory
، فسيتم تعيينها افتراضيًا على None
.
عندما لا يكون المفتاح الذي تبحث عنه موجودًا ، يتم تشغيل طريقة __missing__()
، وتستنتج القيمة الافتراضية من default_factory
الافتراضي. ثم تقوم بإرجاع هذه القيمة الافتراضية.
في تلخيص:
- في Python ، يُرجع
defaultdict
الافتراضي القيمة الافتراضية عندما لا يكون المفتاح موجودًا. - كما أنه يضيف زوج القيمة الافتراضية هذا إلى القاموس ، والذي يمكنك تعديله بعد ذلك.
أمثلة لـ Python Defaultdict

بعد ذلك ، سنقوم بتشفير بعض الأمثلة لفهم كيفية عمل Python defaultdict.
Defaultdict في Python بقيمة صحيحة افتراضية
أولاً ، قم باستيراد defaultdict
من وحدة collections
.
from collections import defaultdict import random
دعونا ننشئ prices
افتراضية.
prices = defaultdict(int)
نقوم الآن بملء قاموس prices
باستخدام عناصر قائمة fruits
كمفاتيح. ونقوم بأخذ عينات عشوائية من القيم من قائمة price_list
للحصول على القيم.
price_list = [10,23,12,19,5] fruits = ['apple','strawberry','pomegranate','blueberry'] for fruit in fruits: prices[fruit] = random.choice(price_list)
دعنا نلقي نظرة على أزواج القيمة الرئيسية في تقصير prices
.
print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10)])
مثل قاموس Python العادي ، يمكنك الوصول إلى قيم prices
الافتراضية باستخدام المفاتيح:
prices['apple'] # 23
الآن ، دعنا نحاول الوصول إلى سعر فاكهة غير موجودة ، على سبيل المثال ، "برتقالية". نرى أنه يُرجع القيمة الافتراضية للصفر.
prices['orange'] # 0
إذا قمنا بطباعة القاموس ، فسنلاحظ أنه تمت إضافة مفتاح جديد "برتقالي" بقيمة صحيحة افتراضية وهي صفر.
print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10), ('orange', 0)])
Defaultdict في Python مع القائمة باعتبارها القيمة الافتراضية
دعنا نحدد students_majors
defaultdict
للقوائم. أسماء التخصصات هي المفاتيح. والقيم هي قوائم الطلاب الذين يتابعون كل تخصص ، مثل الرياضيات والاقتصاد وعلوم الكمبيوتر وغير ذلك.
from collections import defaultdict students_majors = defaultdict(list)
إذا حاولنا الوصول إلى قائمة الطلاب المقابلة لـ "اقتصاديات" ، يُرجع الديكت الافتراضي قائمة فارغة ؛ لا توجد أخطاء رئيسية!
students_majors['Economics'] # []
لدينا الآن قائمة فارغة تم تعيينها لتخصص "الاقتصاد". لذا يمكننا الآن إضافة عناصر إلى هذه القائمة باستخدام طريقة القائمة. .append()
.
students_majors['Economics'].append('Alex')
تم إنشاء إدخال لـ "اقتصاديات" في القاموس الافتراضي students_majors
.
print(students_majors)
defaultdict(<class 'list'>, {'Economics': ['Alex']})
يمكنك إضافة المزيد من الطلاب إلى تعيين القائمة إلى تخصص الاقتصاد وإضافة تخصص جديد وغير ذلك الكثير!
students_majors['Economics'].append('Bob') students_majors['Math'].append('Laura') print(students_majors)
defaultdict(<class 'list'>, {'Economics': ['Alex', 'Bob'], 'Math': ['Laura']})
استنتاج
آمل أن يساعدك هذا البرنامج التعليمي في فهم كيف ومتى يجب عليك استخدام defaultdict في Python. بعد تشغيل أمثلة التعليمات البرمجية في هذا البرنامج التعليمي ، يمكنك محاولة استخدام defaultdict باعتباره بنية البيانات المفضلة في مشاريعك عند الحاجة.
فيما يلي ملخص لما تعلمته في هذا البرنامج التعليمي.
- عند العمل باستخدام قاموس Python ، غالبًا ما تصادف KeyErrors.
- للتعامل مع مثل هذه KeyErrors ، يمكنك استخدام عدة طرق مطولة. يمكنك استخدام العبارات الشرطية أو كتل try-except أو طريقة .get (). لكن نوع البيانات الافتراضي في وحدة المجموعات يمكن أن يبسط معالجة KeyError.
- يمكنك استخدام defaultdict (default_factory) حيث يكون default_factory قابلاً للاستدعاء صالحًا.
- عندما لا يكون المفتاح موجودًا في البيان الافتراضي ، تتم إضافة القيمة الافتراضية ( المستنبطة من المصنع الافتراضي) والمفتاح إلى القرار الافتراضي.
بعد ذلك ، تحقق من البرنامج التعليمي حول وظيفة خريطة Python.