الفرق بين المراجعتين لصفحة: «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>


تعيد الدالة البانية لهذا الصنف كائنًا جديدًا شبيهًا بالقاموس، وdefaultdict هو صنف متفرّع من الصنف الداخلي dict يعيد تعريف override تابع واحد ويضيف متغير نسخة واحدًا قابلًا للكتابة. أما بقية التوابع فهي مماثلة للصنف الرئيسي ولن توثّق هنا.
تعيد الدالة البانية لهذا الصنف كائنًا جديدًا شبيهًا [[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]]:


تقدّم كائنات defaultdict التابع التالي إضافة إلى التوابع والعمليات المعيارية للصنف dict:
=== التابع <code>‎[[Python/defaultdict/ missing|__missing__()‎]]</code> ===


=== التابع <code>‎__missing__()</code> ===
يستدعى التابع <code>‎[[Python/defaultdict/ missing|__missing__()]]</code>[[Python/defaultdict/ missing|]] من قبل التابع <code>‎__getitem__()‎</code> في الصنف <code>[[Python/dict|dict]]</code> عند عدم العثور على المفتاح المطلوب، ويعيد أو يطلق التابع الأخير كلّ ما يعيده أو يطلقه التابع الأوّل من قيم أو استثناءات.
 
يستدعى التابع ‎__missing__()‎ من قبل التابع ‎__getitem__()‎ في الصنف dict عند عدم العثور على المفتاح المطلوب، ويعيد أو يطلق التابع الأخير كلّ ما يعيده أو يطلقه التابع الأوّل من قيم أو استثناءات.


== خصائص كائنات <code>defaultdict</code> ==
== خصائص كائنات <code>defaultdict</code> ==


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


=== <code>default_factory</code> ===
=== <code>default_factory</code> ===


تستخدم هذه الخاصية من قبل التابع ‎__missing__()‎، وتُهيّئ من المعامل الأول في الدالة البانية للكائن defaultdict إن كان معرّفًا، وتأخذ القيمة None إن لم يكن المعامل معرّفًا.
تستخدم هذه الخاصية من قبل التابع [[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: :تغليف حول كائنات السلاسل النصية لتسهيل عملية تفريع أصناف السلاسل النصية

مصادر