كائنات defaultdict‎ في بايثون

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث

صنف متفرّع من الصنف الداخلي dict يعيد تعريف override تابع واحد ويضيف متغير نسخة واحدًا قابلًا للكتابة.

البنية العامة

class collections.defaultdict([default_factory[, ...]])

تعيد الدالة البانية لهذا الصنف كائنًا جديدًا شبيهًا بالقاموس، وdefaultdict هو صنف متفرّع من الصنف الداخلي dict يعيد تعريف override تابع واحد ويضيف متغير نسخة واحدًا قابلًا للكتابة. أما بقية التوابع فهي مماثلة للصنف الرئيسي ولن توثّق هنا.

يحدّد المعامل الأول القيمة الابتدائية للخاصية default_factory ويأخذ هذا المعامل القيمة الافتراضية None. أما بقية المعاملات (ومن ضمنها المعاملات المفتاحية) فتعامل وكأنّها ممرّرة إلى الدالة البانية للصنف dict.

توابع كائنات defaultdict

تقدّم كائنات defaultdict التابع التالي إضافة إلى التوابع والعمليات المعيارية للصنف dict:

التابع ‎__missing__()‎

يستدعى التابع ‎__missing__() من قبل التابع ‎__getitem__()‎ في الصنف dict عند عدم العثور على المفتاح المطلوب، ويعيد أو يطلق التابع الأخير كلّ ما يعيده أو يطلقه التابع الأوّل من قيم أو استثناءات.

خصائص كائنات defaultdict

تقدّم كائنات defaultdict متغير النسخة التالي:

default_factory

تستخدم هذه الخاصية من قبل التابع ‎__missing__()، وتُهيّئ من المعامل الأول في الدالة البانية للكائن defaultdict إن كان معرّفًا، وتأخذ القيمة None إن لم يكن المعامل معرّفًا.

أمثلة وتطبيقات

يمكن استخدام القيمة list كقيمة للخاصية default_factory وذلك لتجميع تسلسل من أزواج مفتاح-قيمة في قاموس من القوائم:

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

عندما تتعرض الشيفرة لكلّ مفتاح في القاموس للمرة الأولى، لا يكون ذلك المفتاح ضمن عملية الربط mapping؛ لذا يُنشئ عنصر بصورة تلقائية باستخدام دالة default_factory والتي تعيد قائمة فارغة، بعد ذلك يُدرج التابع list.append() القيمة في القائمة الجديدة.

عند العودة إلى المفاتيح مرة أخرى، تجري عملية البحث بصورة طبيعية (تعيد القائمة المقترنة بالمفتاح) ويضيف التابع list.append()‎ قيمة أخرى إلى القائمة. هذه الطريقة أبسط وأسرع من الطريقة التي تؤدي الوظيفة نفسها باستخدام التابع dict.setdefault()‎:

>>> d = {}
>>> for k, v in s:
...     d.setdefault(k, []).append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

يمكن استخدام int كقيمة للخاصية default_factory وذلك لاستخدام كائن defaultdict في العد (مثل bag أو multiset في لغات البرمجة الأخرى):

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> sorted(d.items())
[('i', 4), ('m', 1), ('p', 2), ('s', 4)]

عند تعرض الشيفرة لحرف من حروف السلسلة النصية للمرة الأولى لا يكون ذلك الحرف موجودًا في عملية الربط؛ لذا تستدعي دالة default_factory الدالة int()‎ لتعيين القيمة الافتراضية صفر، ثم يبدأ عدّ الحروف بواسطة عملية الإضافة.

تعدّ الدالة int()‎ والتي تعيد دائمًا القيمة 0 حالة خاصّة من حالات الدوال الثابتة، وهناك طريقة أسرع وأكثر مرونة لإنشاء دوال ثابتة وهي باستخدام دالة lambda والتي يمكن عن طريقها تقديم أي قيمة ثابتة (وليس الصفر فقط):

>>> def constant_factory(value):
...     return lambda: value
>>> d = defaultdict(constant_factory('<missing>'))
>>> d.update(name='John', action='ran')
>>> '%(name)s %(action)s to %(object)s' % d
'John ran to <missing>'

يمكن استخدام set كقيمة للخاصية default_factory لبناء قاموس من المجموعات:

>>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
>>> d = defaultdict(set)
>>> for k, v in s:
...     d[k].add(v)
...
>>> sorted(d.items())
[('blue', {2, 4}), ('red', {1, 3})]

انظر أيضًا

  • كائنات namedtuple: :دالة مولِّدة factory function لإنشاء أصناف فرعية من tuple تتضمن حقولًا مسمّاة
  • كائنات deque: :حاوية شبيهة بالقوائم تمتاز بأدائها السريع في إضافة العناصر وحذفها في كلا الطرفين.
  • كائنات ChainMap: :صنف شبيه بالقواميس يستخدم لإنشاء عرض منفرد لعمليات ربط mapping متعددة
  • كائنات Counter: :صنف فرعي من الصنف dict الهدف منه عدّ الكائنات القابلة للتقطيع hashable
  • كائنات OrderedDict: :صنف فرعي من الصنف dict يمكنه تذكّر ترتيب العناصر عند إضافتها
  • كائنات UserDict: :تغليف حول كائنات القواميس لتسهيل عملية تفريع أصناف القواميس
  • كائنات UserList: :تغليف حول كائنات القوائم لتسهيل عملية تفريع أصناف القوائم
  • كائنات UserString: :تغليف حول كائنات السلاسل النصية لتسهيل عملية تفريع أصناف السلاسل النصية

مصادر