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