دیکشنری های پایتون (اشیاء از نوع dict) ترتیب عناصر را حفظ نمی کنند. CPython این کار را از 3.6 انجام داده است، اما در سایر پیاده سازی ها به پیاده سازی وابسته و نامشخص است. مشخصات زبان از 3.7 نظم را حفظ کرده است.
OrderedDict در ماژول مجموعه های کتابخانه استاندارد به عنوان فرهنگ لغت ارائه شده است که نظم را حفظ می کند. استفاده از این یکی بی خطر است.
ماژول مجموعه ها را وارد کنید. در کتابخانه استاندارد گنجانده شده است و نیازی به نصب ندارد.
import collections
اگر موارد زیر را بنویسید، می توانید مجموعه ها را حذف کنید. در مثال های زیر
from collections import OrderedDict
در ادامه نحوه استفاده از OrderedDict توضیح داده شده است.
- ایجاد یک شی OrderedDict
- OrderedDict یک زیر کلاس از dict است
- عناصر را به ابتدا یا انتها منتقل کنید
- در هر موقعیتی یک عنصر جدید اضافه کنید.
- ترتیب مجدد (ترتیب مجدد) عناصر
- عناصر را بر اساس کلید یا مقدار مرتب کنید
ایجاد یک شی OrderedDict
می توان از constructor collections.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) نیز می توانند به سازنده منتقل شوند، اما در مورد پیاده سازی هایی که نوع dict نظم را حفظ نمی کند، OrderedDict تولید شده از آن نیز نظم را حفظ نخواهد کرد.
print(collections.OrderedDict({'k1': 1, 'k2': 2, 'k3': 3}))
# OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
OrderedDict یک زیر کلاس از dict است
OrderedDict یک زیر کلاس از dict است.
print(issubclass(collections.OrderedDict, dict))
# True
OrderedDict نیز همان متدهای dict را دارد و روش های بدست آوردن، تغییر، افزودن و حذف عناصر نیز مانند dict است.
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 برای انتقال یک عنصر به ابتدا یا انتها استفاده کنید.
کلید را به عنوان اولین آرگومان مشخص کنید. پیش فرض انتقال به انتها است، اما اگر آرگومان دوم آخرین false باشد، به ابتدا منتقل می شود.
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 جدید با یک عنصر جدید در یک موقعیت دلخواه امکان پذیر است. به طور خاص، این را می توان در جریان زیر انجام داد.
- اشیاء view را که می توان با متد ()item با استفاده از list() بدست آورد فهرست کنید.
- یک تاپل (کلید، مقدار) از جفت های کلید-مقدار در متد insert() لیست اضافه کنید
- یک شی جدید با ارسال آن به مجموعه های سازنده ایجاد کنید.OrderedDict()
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() موقعیتی را که قرار است به عنوان آرگومان اول درج شود و عنصری را که باید به عنوان آرگومان دوم درج شود مشخص می کند.
در مثال، یک شی جدید به متغیر اصلی اختصاص داده می شود و هیچ عنصر جدیدی به خود شی اصلی اضافه نمی شود.
ترتیب مجدد (ترتیب مجدد) عناصر
جایگزینی عناصر همان فرآیندی است که در مثال بالا وجود دارد.
- اشیاء view را که می توان با متد ()item با استفاده از list() بدست آورد فهرست کنید.
- عناصر را در یک لیست جایگزین کنید
- یک شی جدید با ارسال آن به مجموعه های سازنده ایجاد کنید.OrderedDict()
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)])
عناصر را بر اساس کلید یا مقدار مرتب کنید
فهرستی از تاپل ها (کلید، مقدار) از جفت های کلید-مقدار مرتب شده را بر اساس شی view که می توان با متد ()item بدست آورد، ایجاد کنید و آن را به مجموعه های سازنده ارسال کنید.OrderedDict() برای ایجاد یک شی جدید.
مرتب سازی با تعیین یک تابع ناشناس (عبارت لامبدا) انجام می شود که یک کلید یا مقدار را از یک تاپل (کلید، مقدار) به عنوان کلید آرگومان تابع داخلی sorted() برمی گرداند.
اگر می خواهید ترتیب را برعکس کنید، آرگومان معکوس 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)])