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

في هذا البرنامج التعليمي ، ستتعلم كيفية استخدام الإملاء الافتراضي من وحدة مجموعات 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'

للوصول إلى جميع أزواج المفتاح والقيمة في القاموس ، يمكنك استدعاء طريقة العناصر () في كائن القاموس ، كما هو موضح أدناه:

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 
  • إذا كان الشرط صحيحًا ، فسيتم تنفيذ العبارات الموجودة في if body ، و
  • إذا كان الشرط خطأ ، فسيتم تنفيذ العبارات الموجودة في نص آخر.

في هذا المثال ، الشرط هو التحقق مما إذا كان المفتاح موجودًا في القاموس.

إذا كان المفتاح موجودًا في القاموس ، فسيعيد عامل التشغيل “صحيحًا” ، وإذا تم تنفيذ النص ، فسيتم طباعة القيمة المقابلة.

key = 'The Happiness Equation'
if key in books_authors:
  print(books_authors[key])
else:
  print('Sorry, this key does not exist!')

# Output
# Neil Pasricha

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

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 () هي ديكت.جيت (مفتاح ، default_value) حيث يكون ديكت كائن قاموس صالح في بايثون.

– إذا كان المفتاح موجودًا في القاموس ، فإن طريقة get () ترجع القيمة.
– عدا ذلك ، تقوم بإرجاع القيمة الافتراضية.

في هذا المثال ، المفاتيح هي قائمة بالمفاتيح التي نرغب في الوصول إلى قيمها. نقوم بإجراء حلقة من خلال قائمة المفاتيح لاسترداد القيم المقابلة من قاموس 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 القياسية – داخل وحدة المجموعات.

لذلك عليك استيراده إلى بيئة العمل الخاصة بك:

from collections import defaultdict

إليك الصيغة العامة لاستخدام المصطلح الافتراضي:

defaultdict(default_factory)

يمكنك تحديد استدعاء مثل int أو float أو list كسمة default_factory. إذا لم تقدم قيمة لـ default_factory ، فسيتم تعيينها افتراضيًا على بلا.

عندما لا يكون المفتاح الذي تبحث عنه موجودًا ، يتم تشغيل طريقة __missing __ () ، وتستنتج القيمة الافتراضية من المصنع_ الافتراضي. ثم تقوم بإرجاع هذه القيمة الافتراضية.

في تلخيص:

  • في Python ، يُرجع المؤشر الافتراضي القيمة الافتراضية عندما لا يكون المفتاح موجودًا.
  • كما أنه يضيف زوج القيمة الافتراضية هذا إلى القاموس ، والذي يمكنك تعديله بعد ذلك.

أمثلة لـ Python Defaultdict

بعد ذلك ، سنقوم بتشفير بعض الأمثلة لفهم كيفية عمل Python defaultdict.

Defaultdict في Python بقيمة صحيحة افتراضية

أولاً ، قم باستيراد الديكت الافتراضي من وحدة المجموعات.

from collections import defaultdict
import random

دعونا ننشئ أسعارًا افتراضية.

prices = defaultdict(int)

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

price_list = [10,23,12,19,5]
fruits = ['apple','strawberry','pomegranate','blueberry']

for fruit in fruits:
  prices[fruit] = random.choice(price_list)

دعنا نلقي نظرة على أزواج القيمة الرئيسية في تقصير الأسعار.

print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10)])

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

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 كقائمة افتراضية للقوائم. أسماء التخصصات هي المفاتيح. والقيم هي قوائم الطلاب الذين يتابعون كل تخصص ، مثل الرياضيات والاقتصاد وعلوم الكمبيوتر وغير ذلك.

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.