OrderedDict در پایتون – توضیح کاربرد به زبان ساده + کد و مثال
«دیکشنری مرتب» (Ordered Dictionary) یا همان «OrderedDict» بسیار شبیه به دیکشنری در پایتون است و چندان تفاوت بزرگی بین این دو وجود ندارد. «کارکرد فنی» OrderedDict در پایتون نیز بسیار به دیکشنری در پایتون شباهت دارد. اما نکته کلیدی در این خصوص این است که دیکشنری مرتب آیتمی به حساب میآید که در زمره «کالکشنها» (Collection) در پایتون قرار میگیرد. بنابراین، این نگهدارندههای کالکشن اساساً نوع دادههای جایگزین برای انواع داده پیشفرض پایتون مثل set ،dict (نوع داده مجموعه در پایتون) و سایر موارد به حساب میآیند.
OrderedDict در پایتون چیست؟
OrderedDict نوع دادهای است که در حیطه دیکشنری نگهدارنده کالکشن قرار میگیرد. از دیدگاه عملکردی، این دیکشنریهای مرتبسازی شده، قابلیت به خاطر سپردن ترتیب ورود مقادیر را دارند. بنابراین، چینشی که مقادیر بر اساس آن در دیکشنری قرار میگیرند به خوبی توسط نوع داده OrderedDict قابل درک است.
در نتیجه وقتی کلید جدیدی اضافه میشود یا یکی از کلیدهای فعلی تغییر میکند، چینش دوباره تنظیم خواهد شد، به این صورت که کلیدِ جدیداً تغییریافته به عنوان آخرین آیتم در نوع داده دیکشنری مرتبسازی شده قرار داده میشود. این در واقع اصلیترین تفاوت میان دیکشنری مرتب با دیکشنری معمولی در پایتون است.
به بیان دیگر، OrderedDict در پایتون زیرکلاسی از کلاس دیکشنری است که ترتیب درج کلیدها را به خاطر میسپارد.
تفاوت dict با OrderedDict در پایتون چیست؟
تنها تفاوت میان dict با OrderedDict در پایتون این است که OrderedDict ترتیبی که براساس آن کلیدها درج میشوند را به خاطر میسپارد. یک دیکشنری معمولی ترتیب درج را رصد نمیکند و تکرار در آن مقادیر را به ترتیبی خودسرانه ارائه میدهد. بر خلاف آن، ترتیبی که آیتمها درج میشوند به وسیله OrderedDict به خاطر سپرده میشود.
سینتکس OrderedDict در پایتون چگونه است؟
سینتکس OrderedDict در پایتون به این صورت است که ابتدا باید ماژول OrderedDict را در برنامه ایمپورت کنیم و سپس با نسبت دادن تابع یا متُد OrderedDict() به یک متغیر آن را به یک OrderedDict تبدیل میکنیم. در ادامه سینتکس OrderedDict در پایتون آمده است.
from collections import OrderedDict
dictionary_variable = OrderedDict()
در سینتکس بالا، ابتدا کلاس دیکشنری مرتبسازی شده از کلاس Collections ایمپورت شده است. این کار به وسیله گزاره import
انجام میشود. در اینجا گزاره import
مرجع قرار داده شده است تا کلاس OrderedDict را از نگهدارنده کالکشن ایمپورت (وارد) کند. سپس متغیری اعلان میشود تا یک متغیر دیکشنری به وسیله ارجاع به متُد OrderedDict ایجاد شود. بنابراین، انجام این ارجاع، نوع داده OrderedDict را فعال میکند.
کاربران میتوانند آیتمهای جدیدی را در دیکشنری مرتب درج کنند و از اینجا به بعد، دیکشنری ترتیب درج را حفظ خواهد کرد. نکته مهم این است که متغیر دیکشنری که در اینجا استفاده شده، به عنوان یک تابع OrderedDict()
عمل خواهد کرد.
نکته کلیدی در خصوص OrderedDict این است که OrderedDict در پایتون نسخه ۲.۷ انرژی بسیار زیادی را مصرف میکند. در نسخه ۲.۷ این انرژی مصرفی نسبت به انرژی مورد استفاده توسط یک دیکشنری معمولی بسیار بیشتر است. به علاوه، این اختلاف حافظه میان دیکشنری مرتب و دیکشنری معمولی در نسخه پایتون ۲.۷ به این دلیل رخ میدهد که لیست پیادهسازی پیوند داده شده دو برابری برای مرتبسازی مقادیر با ترتیبی مشخص به منظور حفظ ترتیب درج وجود دارد.
جالب است که از آغاز ارائه نسخههای ۳.۷ پایتون به بعد، خود دیکشنریهای معمولی اطمینان حاصل میکنند ترتیب درج حفظ شود. بنابراین از نسخههای ۳.۷ پایتون، به جای استفاده از OrderedDict برای اطمینان از ترتیب درج، همان دیکشنریهای معمولی خودشان این ضرورت را فراهم میکنند. این یک مزیت بزرگ دیکشنریها در نسخههای ۳.۷ پایتون به حساب میآید.
مهم ترین توابع در OrderedDict پایتون کدامند؟
دو تابع مهم قابل استفاده در OrderedDict پایتون به نامهای popitem و move_to_end وجود دارد. در این بخش به معرفی این دو تابع پرداخته شده است.
متد popitem در OrderedDict پایتون
متد popitem برای برداشتن یا حذف یک جُفت کلید-مقدار از OrderedDict در پایتون مورد استفاده قرار میگیرد. بنابراین، متُد popitem مسئولیت حذف یک آیتم از دیکشنری را بر عهده دارد. لذا وقتی که لازم باشد یک آیتم مشخص از دیکشنری حذف شود، آنگاه میتوان از متُد popitem
در OrderedDict پایتون استفاده کرد. متُد popitem
دارای آرگومانی به نام last
است. آرگومان last
دارای ۲ مقدار True
یا False
خواهد بود.
وقتی مقدار True
به متغیر last
تخصیص داده میشود، آنگاه pop
براساس اصل «آخرین ورودی اولین خروجی» (Last In First Out | LIFO) عمل خواهد کرد. همچنین، وقتی last=False
باشد، آنگاه عملیات pop
براساس قاعده FIFO عمل خواهد کرد. در FIFO وقتی pop
فراخوانی میشود، اولین آیتم درج شده به عنوان اولین آیتم خارج شده حذف خواهد شد.
متد move_to_end در OrderedDict پایتون
متد move_to_end برای انتقال یک کلید مشخص به عنوان آخرین آیتم در دیکشنری استفاده میشود. بنابراین، وقتی که لازم باشد یک کلید به سمت راستترین محل انتهایی یا سمت چپترین محل انتهایی انتقال داده شود، آنگاه میتوان از متُد move_to_end استفاده کرد. متد move_to_end
بهگونهای عمل میکند که وقتی last=true
است، آنگاه کلید مشخص شده به نقطه انتهایی سمت راست دیکشنری منتقل میشود. در حالی که، وقتی مقدار متغیر last
برابر با False
باشد، کلید مربوطه در انتهای سمت چپ دیکشنری قرار داده میشود.
بنابراین، آخرین آرگومان مشخص میکند که آیا کلید تازه درج شده باید در انتهای سمت چپ یا انتهای سمت راست قرار داده شود. توابعی مثل move_to_end
میزان زیادی انعطافپذیری را برای مدیریت چینش دیکشنری OrderedDict به ارمغان میآورند. این قابلیت از جمله مزیتهای کلیدی استفاده از OrderedDict به جای دیکشنریهای معمولی به حساب میآید.
موقعیت و محل کلیدهای موجود را میتوان به گونهای انعطافپذیرانه تغییر داد یا آنها را در داخل آیتم دیکشنری در محل مورد نیاز قرار داد.
معرفی فیلم های آموزش پایتون تم آف
در پلتفرم تم آف دورههای آموزش پایتون در قالب مجموعهای آموزشی گردآوری شدهاند. البته مجموعههای آموزشی متعددی به خصوص در ارتباط با حوزهها و فناوریهای مختلف برنامه نویسی در مجموعه تم آف وجود دارد. علاقهمندان به این زبان برنامه نویسی میتوانند برای شروع یادگیری پایتون از دورههای مقدماتی آن استفاده کنند. همچنین، چندین دوره آموزشی پروژهمحور نیز در این مجموعه برای ادامه یادگیری و تقویت مهارت برنامه نویسی پایتون در دسترس علاقهمندان قرار دارند. در تصویر فوق تنها تعداد کمی از دورههای آموزشی پروژهمحور مجموعه آموزش پایتون ملاحظه میشود.
- برای دسترسی به همه فیلم های آموزش پایتون تم آف + اینجا کلیک کنید.
مثال OrderedDict در پایتون
در این بخش مثالی برای OrderedDict در پایتون ارائه شده است. کدهای این مثال در ادامه آمده است.
پس از این کدها و نمایش خروجی، توضیحات لازم در خصوص کدها نیز ارائه شدهاند.
from collections import OrderedDict
print("Normal Dicitonary:n")
Normal_dict = {}
Normal_dict['Item1'] = 10
Normal_dict['Item2'] = 20
Normal_dict['Item3'] = 30
Normal_dict['Item4'] = 40
Normal_dict['Item3'] = 70
for item_key, item_value in Normal_dict.items():
print(item_key, item_value)
ordered_dict = OrderedDict()
ordered_dict['Item1'] = 10
ordered_dict['Item2'] = 20
ordered_dict['Item3'] = 30
ordered_dict['Item4'] = 40
ordered_dict.move_to_end('Item3')
print("n Ordered dicitonary before pop and move to end applied:n")
for item_key, item_value in ordered_dict.items():
print(item_key, item_value)
ordered_dict.popitem(last=False)
print("n Ordered dicitonary after pop:n")
for item_key, item_value in ordered_dict.items():
print(item_key, item_value)
خروجی کدهای فوق به صورت زیر است.
توضیحات کدهای مثال OrderedDict در پایتون
در این بخش توضیحات مربوط به کدهای بالا ارائه شدهاند:
- در این مثال، ۲ دیکشنری ساخته شده است. اولین مورد یک دیکشنری معمولی به حساب میآید و آیتمها در داخل آن قرار داده و نمایش داده شدهاند. سپس، یک دیکشنری مرتب ایجاد و پس از آن نیز تابع یا همان متُد move_to_end
روی آن اجرا شده است. بنابراین این تابع move_to_end
اعمال شده روی آیتم سوم باعث میشود که آیتم سوم به آیتم آخر در دیکشنری تبدیل شود.
- سپس متُد popitem
اِعمال شده است. این متُد اولین آیتم را از دیکشنری حذف میکند، زیرا pop
با آرگومان last=False
اجرا میشود. به علاوه، از زمان ارائه نسخه ۳.۷ پایتون به جای استفاده از OrderedDict به منظور حصول اطمینان از ترتیب درج، از همان دیکشنریهای معمولی هم میتوان برای انجام این کار استفاده کرد.
مثال دوم OrderedDict در پایتون
در این بخش نیز مثال دیگری برای آشنایی بیشتر با نحوه عملکرد OrderedDict در پایتون ارائه شده است.
# A Python program to demonstrate working of OrderedDict
from collections import OrderedDict
print("This is a Dict:n")
d = {}
d['a'] = 1
d['b'] = 2
d['c'] = 3
d['d'] = 4
for key, value in d.items():
print(key, value)
print("nThis is an Ordered Dict:n")
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
od['d'] = 4
for key, value in od.items():
print(key, value)
خروجی کدهای فوق به صورت زیر است.
This is a Dict: a 1 c 3 b 2 d 4 This is an Ordered Dict: a 1 b 2 c 3 d 4
نکات مهم پیرامون OrderedDict در پایتون با ذکر مثال
در این بخش به شرح نکات مهمی پرداخته شده است که باید در خصوص OrderedDict در پایتون بدانیم.
تغییر مقدار کلید در OrderedDict پایتون
در صورتی که مقدار یک کلید خاص تغییر کند، محل آن کلید در OrderedDict بدون تغییر باقی میماند. در ادامه مثالی برای این نکته مهم آمده است.
# A Python program to demonstrate working of key
# value change in OrderedDict
from collections import OrderedDict
print("Before:n")
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
od['d'] = 4
for key, value in od.items():
print(key, value)
print("nAfter:n")
od['c'] = 5
for key, value in od.items():
print(key, value)
خروجی کدهای فوق به صورت زیر است.
Before: a 1 b 2 c 3 d 4 After: a 1 b 2 c 5 d 4
حذف و درج مجدد در OrderedDict پایتون
حذف و درج مجدد کلید باعث میشود که آن کلید به انتهای دیکشنری منتقل شود، هر چند OrderedDict پایتون ترتیب درج حفظ میشود. برای این مورد نیز در ادامه مثالی ارائه شده است.
# A Python program to demonstrate working of deletion
# re-insertion in OrderedDict
from collections import OrderedDict
print("Before deleting:n")
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
od['d'] = 4
for key, value in od.items():
print(key, value)
print("nAfter deleting:n")
od.pop('c')
for key, value in od.items():
print(key, value)
print("nAfter re-inserting:n")
od['c'] = 3
for key, value in od.items():
print(key, value)
خروجی کدهای بالا نیز به صورت زیر خواهد بود.
Before deleting: a 1 b 2 c 3 d 4 After deleting: a 1 b 2 d 4 After re-inserting: a 1 b 2 d 4 c 3
جمعبندی
کالکشنهایی مثل دیکشنری مرتب یا همان OrderedDict در پایتون برای پیادهسازی عملکرد حافظه پنهان LRU بسیار کاربردی و مفید هستند. بنابراین، این نوع از عملکرد حافظه پنهان LRU مثل آیتمهایی که انتظار چینش آیتمها برای حفظ ترتیب چینش از آنها میرود از جمله حوزههای اصلی هستند که قابلیت عملکردی OrderedDict به طور وسیع به کار گرفته میشود. تستهای برابری در میان اشیای OrderedDict و سایر اشیای نگاشتی برخلاف دیکشنریهای معمولی به ترتیب چینش حساس نیستند. این تفاوت اصلی OrderedDict با دیکشنری معمولی است.