كيفية استخدام OrderedDict ، قاموس بايثون مرتب.

اعمال

قواميس بايثون (كائنات من نوع ديكت) لا تحافظ على ترتيب العناصر ؛ قامت CPython بذلك منذ 3.6 ، لكنها تعتمد على التنفيذ وغير محددة في تطبيقات أخرى ؛ احتفظت مواصفات اللغة بالترتيب منذ 3.7.

يتم توفير OrderedDict في وحدة المجموعات بالمكتبة القياسية كقاموس يحافظ على الترتيب. من الآمن استخدام هذا.

استيراد وحدة المجموعات. تم تضمينه في المكتبة القياسية ولا يحتاج إلى التثبيت.

import collections

إذا كتبت ما يلي ، يمكنك حذف المجموعات. في الأمثلة التالية.

from collections import OrderedDict

فيما يلي وصف لكيفية استخدام OrderedDict.

  • إنشاء كائن OrderedDict
  • OrderedDict هي فئة فرعية للديكت
  • انقل العناصر إلى البداية أو النهاية
  • أضف عنصرًا جديدًا في أي موضع.
  • إعادة ترتيب (إعادة ترتيب) العناصر
  • فرز العناصر حسب المفتاح أو القيمة

إنشاء كائن OrderedDict

يمكن استخدام مجموعات المُنشئ .OrderedDict () لإنشاء كائن OrderedDict.

إنشاء كائن OrderedDict فارغ وإضافة القيم.

od = collections.OrderedDict()

od['k1'] = 1
od['k2'] = 2
od['k3'] = 3

print(od)
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

من الممكن أيضًا تحديد الحجج للمُنشئ.

يمكنك استخدام وسيطات الكلمات الأساسية ، وتسلسل أزواج القيمة الرئيسية (مثل المجموعات (مفتاح ، قيمة)) ، وما إلى ذلك. يمكن أن يكون الأخير قائمة أو مجموعة طالما أنه زوج من المفاتيح والقيمة.

print(collections.OrderedDict(k1=1, k2=2, k3=3))
print(collections.OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)]))
print(collections.OrderedDict((['k1', 1], ['k2', 2], ['k3', 3])))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

حتى الإصدار 3.5 ، لم يتم الاحتفاظ بترتيب وسيطات الكلمات الرئيسية ، ولكن منذ الإصدار 3.6 ، يتم الاحتفاظ بها الآن.

تم التغيير في الإصدار 3.6: مع قبول PEP 468 ، يتم الاحتفاظ بترتيب مُنشئ OrderedDict ووسيطات الكلمات الأساسية التي تم تمريرها إلى طريقة update ().
collections — Container datatypes — Python 3.10.0 Documentation

يمكن أيضًا تمرير القواميس العادية (كائنات من نوع ديكت) إلى المُنشئ ، ولكن في حالة التطبيقات التي لا يحافظ فيها نوع dict على الترتيب ، فإن OrderedDict الذي تم إنشاؤه منه لن يحافظ أيضًا على النظام.

print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])

OrderedDict هي فئة فرعية للديكت

OrderedDict هي فئة فرعية للديكت.

print(issubclass(collections.OrderedDict, dict))
# True

يحتوي OrderedDict أيضًا على نفس الأساليب التي يستخدمهاict ، وطرق الحصول على العناصر وتغييرها وإضافتها وإزالتها هي نفسها الخاصة بـ deb.

print(od['k1'])
# 1

od['k2'] = 200
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

od.update(k4=4, k5=5)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('k4', 4), ('k5', 5)])

del od['k4'], od['k5']
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

راجع المقالة التالية للحصول على التفاصيل.

انقل العناصر إلى البداية أو النهاية

يمكنك استخدام طريقة OrderedDict الخاصة move_to_end () لتحريك عنصر إلى البداية أو النهاية.

حدد المفتاح ليكون الوسيطة الأولى. الافتراضي هو الانتقال إلى النهاية ، ولكن إذا كانت الوسيطة الثانية خاطئة ، فسيتم نقلها إلى البداية.

od.move_to_end('k1')
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1)])

od.move_to_end('k1', False)
print(od)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3)])

أضف عنصرًا جديدًا في أي موضع.

من الممكن إنشاء كائن OrderedDict جديد مع إضافة عنصر جديد في موضع عشوائي. على وجه التحديد ، يمكن القيام بذلك في التدفق التالي.

  1. ضع قائمة بكائنات العرض التي يمكن الحصول عليها باستخدام طريقة العناصر () باستخدام list ().
  2. أضف tuple (مفتاح ، قيمة) لأزواج القيمة والمفتاح في طريقة insert () الخاصة بالقائمة
  3. قم بإنشاء كائن جديد عن طريق تمريره إلى مجموعات المنشئ.
l = list(od.items())
print(l)
# [('k1', 1), ('k2', 200), ('k3', 3)]

l.insert(1, ('kx', -1))
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)])

يُحدِّد insert () الموضع الذي سيتم إدراجه باعتباره الوسيطة الأولى ، والعنصر الذي سيتم إدراجه باعتباره الوسيطة الثانية.

في المثال ، تم تعيين كائن جديد إلى المتغير الأصلي ، ولم تتم إضافة عناصر جديدة إلى الكائن الأصلي نفسه.

إعادة ترتيب (إعادة ترتيب) العناصر

استبدال العناصر هو نفس العملية كما في المثال أعلاه.

  1. ضع قائمة بكائنات العرض التي يمكن الحصول عليها باستخدام طريقة العناصر () باستخدام list ().
  2. استبدال العناصر في القائمة
  3. قم بإنشاء كائن جديد عن طريق تمريره إلى مجموعات المنشئ.
l = list(od.items())
print(l)
# [('k1', 1), ('kx', -1), ('k2', 200), ('k3', 3)]

l[0], l[2] = l[2], l[0]
print(l)
# [('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('kx', -1), ('k1', 1), ('k3', 3)])

إذا كنت تريد تحديد مفتاح واستبداله ، فاستخدم طريقة index () للحصول على الفهرس (الموضع) من قائمة المفاتيح كما هو موضح أدناه.

l = list(od.items())
k = list(od.keys())
print(k)
# ['k2', 'kx', 'k1', 'k3']

print(k.index('kx'))
# 1

l[k.index('kx')], l[k.index('k3')] = l[k.index('k3')], l[k.index('kx')]
print(l)
# [('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)]

od = collections.OrderedDict(l)
print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

فرز العناصر حسب المفتاح أو القيمة

قم بإنشاء قائمة من المجموعات (مفتاح ، قيمة) لأزواج القيمة والمفتاح المصنفة بناءً على كائن العرض الذي يمكن الحصول عليه بواسطة طريقة العناصر () ، وقم بتمريرها إلى مجموعات المنشئ .OrderedDict () لإنشاء كائن جديد.

يتم إجراء الفرز عن طريق تحديد دالة مجهولة (تعبير lambda) تُرجع مفتاحًا أو قيمة من مجموعة (مفتاح ، قيمة) كمفتاح وسيطة للدالة المضمنة التي تم فرزها ().

إذا كنت تريد عكس الترتيب ، فاضبط الوسيطة العكسية لـ Sorted () على true.

print(od)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])

od_sorted_key = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[0])
)
print(od_sorted_key)
# OrderedDict([('k1', 1), ('k2', 200), ('k3', 3), ('kx', -1)])

od_sorted_value = collections.OrderedDict(
    sorted(od.items(), key=lambda x: x[1], reverse=True)
)
print(od_sorted_value)
# OrderedDict([('k2', 200), ('k3', 3), ('k1', 1), ('kx', -1)])