الفرق بين المراجعتين لصفحة: «Python/defaultdict»
أنشأ الصفحة ب'صنف متفرّع من الصنف الداخلي dict يعيد تعريف override تابع واحد ويضيف متغير نسخة واحدًا قابلًا للكت...' |
|||
(2 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة) | |||
سطر 1: | سطر 1: | ||
صنف متفرّع من الصنف الداخلي dict يعيد تعريف override تابع واحد ويضيف متغير نسخة واحدًا قابلًا للكتابة. | <noinclude>{{DISPLAYTITLE:كائنات <code>defaultdict</code> في بايثون}}</noinclude> | ||
صنف متفرّع من الصنف الداخلي <code>[[Python/dict|dict]]</code> يعيد تعريف override تابع واحد ويضيف متغير نسخة واحدًا قابلًا للكتابة. | |||
== البنية العامة == | == البنية العامة == | ||
سطر 7: | سطر 8: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
تعيد الدالة البانية لهذا الصنف كائنًا جديدًا شبيهًا | تعيد الدالة البانية لهذا الصنف كائنًا جديدًا شبيهًا [[Python/dict|بالقاموس]]، و<code>defaultdict</code> هو صنف متفرّع من الصنف الداخلي <code>[[Python/dict|dict]]</code> يعيد تعريف override تابع واحد ويضيف متغير نسخة واحدًا قابلًا للكتابة. أما بقية التوابع فهي مماثلة للصنف الرئيسي ولن توثّق هنا. | ||
يحدّد المعامل الأول القيمة الابتدائية للخاصية default_factory ويأخذ هذا المعامل القيمة الافتراضية None. أما بقية المعاملات (ومن ضمنها المعاملات المفتاحية) فتعامل وكأنّها ممرّرة إلى الدالة البانية للصنف dict. | يحدّد المعامل الأول القيمة الابتدائية للخاصية <code>default_factory</code> ويأخذ هذا المعامل القيمة الافتراضية <code>None</code>. أما بقية المعاملات (ومن ضمنها المعاملات المفتاحية) فتعامل وكأنّها ممرّرة إلى الدالة البانية للصنف <code>[[Python/dict|dict]]</code>. | ||
== توابع كائنات <code>defaultdict</code> | == توابع كائنات <code>defaultdict</code> == | ||
تقدّم كائنات <code>defaultdict</code> التابع التالي إضافة إلى التوابع والعمليات المعيارية للصنف [[Python/dict|dict]]: | |||
=== التابع <code>[[Python/defaultdict/ missing|__missing__()]]</code> === | |||
يستدعى التابع <code>[[Python/defaultdict/ missing|__missing__()]]</code>[[Python/defaultdict/ missing|]] من قبل التابع <code>__getitem__()</code> في الصنف <code>[[Python/dict|dict]]</code> عند عدم العثور على المفتاح المطلوب، ويعيد أو يطلق التابع الأخير كلّ ما يعيده أو يطلقه التابع الأوّل من قيم أو استثناءات. | |||
== خصائص كائنات <code>defaultdict</code> == | == خصائص كائنات <code>defaultdict</code> == | ||
تقدّم كائنات defaultdict متغير النسخة التالي: | تقدّم كائنات <code>defaultdict</code> متغير النسخة التالي: | ||
=== <code>default_factory</code> === | === <code>default_factory</code> === | ||
تستخدم هذه الخاصية من قبل التابع __missing__() | تستخدم هذه الخاصية من قبل التابع [[Python/defaultdict/ missing|<code>__missing__()</code>]]، وتُهيّئ من المعامل الأول في الدالة البانية للكائن <code>defaultdict</code> إن كان معرّفًا، وتأخذ القيمة <code>None</code> إن لم يكن المعامل معرّفًا. | ||
== أمثلة وتطبيقات == | == أمثلة وتطبيقات == | ||
يمكن استخدام list كقيمة للخاصية default_factory وذلك لتجميع تسلسل من أزواج مفتاح-قيمة في قاموس من القوائم: | يمكن استخدام القيمة <code>list</code> كقيمة للخاصية <code>default_factory</code> وذلك لتجميع تسلسل من أزواج مفتاح-قيمة في [[Python/dict|قاموس]] من [[Python/list|القوائم]]: | ||
<syntaxhighlight lang="python3"> | <syntaxhighlight lang="python3"> | ||
سطر 41: | سطر 41: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
عندما تتعرض الشيفرة لكلّ مفتاح في القاموس للمرة الأولى، لا يكون ذلك المفتاح ضمن عملية الربط mapping؛ لذا يُنشئ عنصر بصورة تلقائية باستخدام دالة default_factory والتي تعيد قائمة فارغة، بعد ذلك يُدرج التابع list.append() القيمة في القائمة الجديدة. | عندما تتعرض الشيفرة لكلّ مفتاح في القاموس للمرة الأولى، لا يكون ذلك المفتاح ضمن عملية الربط mapping؛ لذا يُنشئ عنصر بصورة تلقائية باستخدام دالة <code>default_factory</code> والتي تعيد قائمة فارغة، بعد ذلك يُدرج التابع <code>[[Python/list/append|list.append()]]</code> القيمة في القائمة الجديدة. | ||
عند العودة إلى المفاتيح مرة أخرى، تجري عملية البحث بصورة طبيعية (تعيد القائمة المقترنة بالمفتاح) ويضيف التابع list.append() قيمة أخرى إلى القائمة. هذه الطريقة أبسط وأسرع من الطريقة التي تؤدي الوظيفة نفسها باستخدام التابع dict.setdefault(): | عند العودة إلى المفاتيح مرة أخرى، تجري عملية البحث بصورة طبيعية (تعيد القائمة المقترنة بالمفتاح) ويضيف التابع [[Python/list/append|list.append()]] قيمة أخرى إلى القائمة. هذه الطريقة أبسط وأسرع من الطريقة التي تؤدي الوظيفة نفسها باستخدام التابع [[Python/dict/setdefault|<code>dict.setdefault()</code>]]: | ||
<syntaxhighlight lang="python3"> | <syntaxhighlight lang="python3"> | ||
سطر 54: | سطر 54: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
يمكن استخدام int كقيمة للخاصية default_factory وذلك لاستخدام كائن defaultdict في العد (مثل bag أو multiset في لغات البرمجة الأخرى): | يمكن استخدام <code>int</code> كقيمة للخاصية <code>default_factory</code> وذلك لاستخدام كائن <code>defaultdict</code> في العد (مثل <code>bag</code> أو <code>multiset</code> في لغات البرمجة الأخرى): | ||
<syntaxhighlight lang="python3"> | <syntaxhighlight lang="python3"> | ||
سطر 66: | سطر 66: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
عند تعرض الشيفرة لحرف من حروف السلسلة النصية للمرة الأولى لا يكون ذلك الحرف موجودًا في عملية الربط؛ لذا تستدعي دالة default_factory الدالة int() لتعيين القيمة الافتراضية صفر، ثم يبدأ عدّ الحروف بواسطة عملية الإضافة. | عند تعرض الشيفرة لحرف من حروف السلسلة النصية للمرة الأولى لا يكون ذلك الحرف موجودًا في عملية الربط؛ لذا تستدعي دالة <code>default_factory</code> الدالة <code>[[Python/int|int()]]</code> لتعيين القيمة الافتراضية صفر، ثم يبدأ عدّ الحروف بواسطة عملية الإضافة. | ||
تعدّ الدالة int() والتي تعيد دائمًا القيمة 0 حالة خاصّة من حالات الدوال الثابتة، وهناك طريقة أسرع وأكثر مرونة لإنشاء دوال ثابتة وهي باستخدام دالة lambda والتي يمكن عن طريقها تقديم أي قيمة ثابتة (وليس الصفر فقط): | تعدّ الدالة <code>[[Python/int/bit length|int()]]</code> والتي تعيد دائمًا القيمة <code>0</code> حالة خاصّة من حالات الدوال الثابتة، وهناك طريقة أسرع وأكثر مرونة لإنشاء دوال ثابتة وهي باستخدام [[Python/lambda expressions|دالة lambda]] والتي يمكن عن طريقها تقديم أي قيمة ثابتة (وليس الصفر فقط): | ||
<syntaxhighlight lang="python3"> | <syntaxhighlight lang="python3"> | ||
سطر 79: | سطر 79: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
يمكن استخدام set كقيمة للخاصية default_factory لبناء قاموس من المجموعات: | يمكن استخدام <code>set</code> كقيمة للخاصية <code>default_factory</code> لبناء [[Python/dict|قاموس]] من [[Python/set|المجموعات]]: | ||
<syntaxhighlight lang="python3"> | <syntaxhighlight lang="python3"> | ||
سطر 93: | سطر 93: | ||
== انظر أيضًا == | == انظر أيضًا == | ||
* [[Python/namedtuple|كائنات <code>namedtuple</code>: ]] :دالة مولِّدة factory function لإنشاء أصناف فرعية من tuple تتضمن حقولًا مسمّاة | * [[Python/namedtuple|كائنات <code>namedtuple</code>:]] :دالة مولِّدة factory function لإنشاء أصناف فرعية من tuple تتضمن حقولًا مسمّاة | ||
* [[Python/deque|كائنات <code>deque</code>: ]] :حاوية شبيهة بالقوائم تمتاز بأدائها السريع في إضافة العناصر وحذفها في كلا الطرفين. | * [[Python/deque|كائنات <code>deque</code>:]] :حاوية شبيهة بالقوائم تمتاز بأدائها السريع في إضافة العناصر وحذفها في كلا الطرفين. | ||
* [[Python/ChainMap|كائنات <code>ChainMap</code>: ]] :صنف شبيه بالقواميس يستخدم لإنشاء عرض منفرد لعمليات ربط mapping متعددة | * [[Python/ChainMap|كائنات <code>ChainMap</code>:]] :صنف شبيه بالقواميس يستخدم لإنشاء عرض منفرد لعمليات ربط mapping متعددة | ||
* [[Python/Counter|كائنات <code>Counter</code>: ]] :صنف فرعي من الصنف dict الهدف منه عدّ الكائنات القابلة للتقطيع hashable | * [[Python/Counter|كائنات <code>Counter</code>:]] :صنف فرعي من الصنف dict الهدف منه عدّ الكائنات القابلة للتقطيع hashable | ||
* [[Python/OrderedDict|كائنات <code>OrderedDict</code>: ]] :صنف فرعي من الصنف dict يمكنه تذكّر ترتيب العناصر عند إضافتها | * [[Python/OrderedDict|كائنات <code>OrderedDict</code>:]] :صنف فرعي من الصنف dict يمكنه تذكّر ترتيب العناصر عند إضافتها | ||
* [[Python/UserDict|كائنات <code>UserDict</code>: ]] :تغليف حول كائنات القواميس لتسهيل عملية تفريع أصناف القواميس | * [[Python/UserDict|كائنات <code>UserDict</code>:]] :تغليف حول كائنات القواميس لتسهيل عملية تفريع أصناف القواميس | ||
* [[Python/UserList|كائنات <code>UserList</code>: ]] :تغليف حول كائنات القوائم لتسهيل عملية تفريع أصناف القوائم | * [[Python/UserList|كائنات <code>UserList</code>:]] :تغليف حول كائنات القوائم لتسهيل عملية تفريع أصناف القوائم | ||
* [[Python/UserString|كائنات <code>UserString</code>: ]] :تغليف حول كائنات السلاسل النصية لتسهيل عملية تفريع أصناف السلاسل النصية | * [[Python/UserString|كائنات <code>UserString</code>:]] :تغليف حول كائنات السلاسل النصية لتسهيل عملية تفريع أصناف السلاسل النصية | ||
== مصادر == | == مصادر == |
المراجعة الحالية بتاريخ 20:43، 2 أغسطس 2018
صنف متفرّع من الصنف الداخلي 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
: :تغليف حول كائنات السلاسل النصية لتسهيل عملية تفريع أصناف السلاسل النصية