كيف ومتى يجب عليك استخدام Defaultdict في Python؟

نشرت: 2022-10-06

في هذا البرنامج التعليمي ، ستتعلم كيفية استخدام الإملاء الافتراضي من وحدة مجموعات Python - للتعامل مع KeyErrors بشكل أفضل - عند العمل مع قواميس Python.

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

ومع ذلك ، عندما يكون لديك قواميس متعددة في نص Python الذي تم تعديله أثناء تنفيذ التعليمات البرمجية ، فغالبًا ما ستواجه KeyErrors. وهناك عدة طرق مختلفة يمكنك من خلالها التعامل معها.

ستتعلم في هذا البرنامج التعليمي:

  • ما هي KeyErrors ولماذا تنشأ
  • كيفية التعامل مع KeyErrors
  • كيفية استخدام لغة Python الافتراضية ، وهي فئة فرعية ترث من فئة Dict المضمنة ، للتعامل مع المفاتيح المفقودة بشكل أفضل

هيا نبدأ!

ما هي أخطاء KeyErors في بايثون؟

1

عند تحديد قاموس 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 في بايثون

How-to-Handle-KeyErrors-in-Python

دعنا نتعلم كيفية التعامل مع 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. استخدام عبارات الاستثناءات التجريبية

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

تساعدنا جميع الطرق المذكورة أعلاه في معالجة الأخطاء الرئيسية. ومع ذلك ، فهي مطولة وتتطلب منا التعامل صراحةً مع المفاتيح المفقودة. يمكنك تبسيط هذه العملية باستخدام صيغة افتراضية بدلاً من قاموس عادي.

الافتراضي في بايثون

python-defaultdict

الافتراضي هو فئة فرعية من فئة القاموس ( 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

أمثلة- Defaultdict-1

بعد ذلك ، سنقوم بتشفير بعض الأمثلة لفهم كيفية عمل 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.