كائنات 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
: :تغليف حول كائنات السلاسل النصية لتسهيل عملية تفريع أصناف السلاسل النصية