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

من موسوعة حسوب


القواميس المرتّبة OrderedDict مطابقة للقواميس العادية باستثناء أنّها تتذكر ترتيب العناصر لحظة إدراجها فيها، بمعنى أنّه عند إضافة العناصر إلى قاموس مرتب، تعاد العناصر حسب ترتيب مفاتيحها عند إضافتها أول مرّة.

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

class collections.OrderedDict([items])

تعيد الدالة البانية نسخة من صنف متفرّع عن الصنف dict تدعم جميع توابعه. كائن OrderedDict هو قاموس يتذكّر ترتيب مفاتيحه عند إدخالها أوّل مرة. وإن جرى كتابة عنصر جديد فوق عنصر موجود في القاموس المرتّب، فإنّ موضع الإدخال الأصلي لا يتغيّر، أما حذف عنصر معيّن وإعادة إدراجه في القاموس المرتّب يؤدّي به إلى الذهاب إلى نهاية القاموس.

ملاحظة: هذا الصنف جديد في الإصدار 3.1.

توابع الصنف OrderedDict

يقدّم صنف OrderedDict - إضافة إلى توابع dict المعروفة - تابعين إضافيين هما:

التابع popitem()

يعيد هذا التابع الخاص بالقواميس المرتّبة ويحذف زوج (مفتاح، قيمة).

التابع move_to_end()

يحرّك التابع المفتاح المعطى إلى إحدى نهايتي القاموس المرتّب.

تدعم القواميس المرتّبة -إضافة إلى توابع الربط العادية- عمليات التكرار المعكوسة وذلك بواسطة الدالة reversed()‎.

إجراء المقارنات بين كائنات OrderedDict

إنّ اختبارات المساواة بين كائنات OrderdDict حساسة للترتيب، وتُجرى بحسب التعبير list(od1.items())==list(od2.items())‎. أما اختبارات المساواة بين كائنات OrderedDict وكائنات الربط الأخرى فتكون غير حساسة للترتيب كما هو الحال مع القواميس العادية. وهذا يسمح باستبدال كائنات OrderedDict في أي مكان يُستخدم فيه القاموس العادي.

ملاحظات

  • في الإصدار 3.5 أصبحت عروض العناصر والمفاتيح والقيم في كائنات OrderedDict تدعم التكرار المعكوس باستخدام الدالة revresed()‎.
  • في الإصدار 3.6 من بايثون، وحسب الموافقة الحاصلة في PEP 468، تجري المحافظة على ترتيب المعاملات المفتاحية الممرّرة إلى الدالة البانية للكائن OrderedDict والتابع update()‎ الخاص به.

أمثلة على القواميس المرتبة

لمّا كان القاموس المرتّب يتذكّر ترتيب إدخال العناصر فيه، فبالإمكان استخدامه مع إجراء عملية الفرز وذلك لإنشاء قاموس مفروز:

>>> # قاموس عادي غير مرتب
>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}

>>> # قاموس مرتب حسب المفاتيح
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # قاموس مرتب حسب القيم
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

>>> # قاموس مرتب حسب طول السلسلة النصية في المفاتيح
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])

تحافظ القواميس المرتّبة الجديدة على ترتيبها عند حذف العناصر منها، ولكن تُلحق المفاتيح الجديدة المضافة إلى نهاية القاموس مع المحافظة على ترتيب العناصر الباقية.

من اليسير أيضًا إنشاء قاموس مرتّب يتذكّر ترتيب المفاتيح المدرجة أخيرًا، وعندما يستبدل عنصر جديد عنصرًا آخر موجودًا في القاموس يتغير موضع الإدراج الأصلي ليتحوّل إلى نهاية القاموس:

class LastUpdatedOrderedDict(OrderedDict):
    'Store items in the order the keys were last added'

    def __setitem__(self, key, value):
        if key in self:
            del self[key]
        OrderedDict.__setitem__(self, key, value)

يمكن دمج قاموس مرتّب مع صنف عدّاد Counter وبهذا يصبح بمقدور العداد تذكّر ترتيب العناصر التي يتعرض لها أول مرّة:

class OrderedCounter(Counter, OrderedDict):
    'Counter that remembers the order elements are first encountered'

    def __repr__(self):
        return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))

    def __reduce__(self):
        return self.__class__, (OrderedDict(self),)

انظر أيضًا

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

مصادر