در نوشته مرتب سازی لیست و تاپل در پایتون درباره مرتب سازی لیست ها و تاپل ها در پایتون گفتیم و در دنباله مرتب سازی ساختارهای داده در پایتون، در این نوشته می خواهیم چگونگی مرتب سازی دیکشنری ها را بر پایه کلیدها یا مقدارها بگوییم. دیکشنری ها در برگیرنده دوتایی های Key:Value هستند که فهرست نام کلیدها با متد ()keys و فهرست مقدار Value ها با متد ()values در دسترس خواهند بود.

مرتب سازی نام کلیدها با تبدیل نوع به لیست و تابع ()sorted

از متد ()list می توانیم یک لیست از نام کلیدهای یک دیکشنری بسازیم. در کدهای زیر نخست این لیست از کلیدها ساخته شده و سپس به کمک ()print نمایش داده می شود. اگر دستور ()print را انجام دهید، خواهید دید که بر پایه دیکشنری نمونه ما، numbers_dict، فهرست نام کلیدها نامرتب هستند.

اکنون در کدهای زیر و برای مرتب سازی، لیست برگشتی از فرستادن دیکشنری numbers_dict به متد ()list را به متد ()sorted فرستاده ایم و برگشتی آن مرتب سازی صعودی خواهد بود یعنی از کمترین ارزش به بیشترین ارزش مرتب سازی انجام می شود. در اینجا لیست ما رشته ای است و مرتب سازی بر پایه حرف های الفبا انجام می شود.

با توجه به آنچه که گفته شده، تابع ()sorted، پیش فرض مرتب سازی را صعودی انجام می دهد ولی می توانیم با تعیین reverse به مقدار True، می توانیم مرتب سازی وارونه یا نزولی را انجام دهیم. به گفته دیگر اگر پارامتر reverse را تعیین نکینم، پس مقدار پیش فرض False به کار می رود و مرتب سازی صعودی انجام می شود.

در پایان می خواهیم فهرست مقدارهای Value ها را مرتب کنیم، پس می بایست دستور زیر را به کار ببریم. توجه کنید در دستورهای بالا یا لیستی از کلیدها و یا لیستی از مقدارها مرتب شده اند ولی هنوز خود همه دیکشنری که در برگیرنده دوتایی های Key:Value است را مرتب نکرده ایم.

مرتب سازی بر پایه کلید و به کمک متد ()items

()items متد دیگری است که دیکشنری ها به آن دسترسی دارند و آن فهرستی از دوتایی های کلید و مقدار را برگشت می دهد. هر دوتایی به گونه یک تاپل است که المان یکم آن، نام کلید و المان دوم آن مقدار کلید است و از این رو، نام کلید دارای اندیس صفر و مقدار کلید دارای اندیس یک است. در شکل زیر و در حلقه for، نخست دیکشنری بر پایه کلیدها مرتب می شود. در این زمان دوتایی ها بر پایه اندیس شماره صفر، یعنی نام کلیدها مرتب سازی شده اند و سپس در هر گام حلقه یکی از دوتایی های مرتب شده به درون متغیر item ریخته شده و سپس نام کلید و مقدار کلید نمایش داده می شوند.

کد زیر همسان با کد بالا است ولی در اینجا هر اندیس دوتایی Key:Value در دو متغیر جدا به نام key و value ریخته می شوند ولی در کد بالا، هر دوتایی در یک متغیر به نام item ریخته می شدند.

مرتب سازی با یک تابع ویژه

در نوشته lambda برای تعریف توابع بی نام در پایتون درباره شناساندن (تعریف) تابع های بی نام در پایتون گفتیم و اکنون، در این نوشته، می خواهیم چگونگی به کارگیری تابع های بی نام و عبارت lambda برای مرتب سازی دیکشنری ها بگوییم. تابع sorted دارای یک پارامتر به نام key است که بدنه یا نام یک عبارت lambda را دریافت می کند و سپس آن را بر روی هر المان درون دیکشنری اعمال می کند.

مرتب سازی دیشکنری بر پایه اندازه شمار کارکترهای کلیدها

در کد زیر نخست یک عبارت lambda را شناسانده ایم که در هر گام اندازه شمار کاراکترهای رشته نام کلید را به کمک تابع ()len بدست می آورد. سپس این تابع بی نام به کلید key تابع sorted فرستاده شده است، پس مرتب سازی به شیوه صعودی و از کلیدی با کمترین اندازه شمار کاراکترها به بیشترین است. بنابراین کلید do در آغاز و chahar در پایان مرتب سازی است. yek و seh نیز هم اندازه هستند و چون در خود دیکشنری yek پیش از seh آمده، پس آن دومین کلید در مرتب سازی است. برای فهم بیشتر، خودتان پارامتر reverse=True را نیز آزمایش کنید.

مرتب سازی دیشکنری بر پایه اندازه مقدار کلیدها

همانگونه که گفتیم متد ()items فهرستی از تاپل ها که هر تاپل در برگیرنده یک دوتایی است را برگشت می دهد که در هر تاپل، نام کلید دارای اندیس صفر و مقدار دارای اندیس یک است، پس اگر بخواهیم با همان رویکرد بالا دیکشنری را بر پایه مقدار کلیدها مرتب کنیم، باید اندیس یک را به کار ببریم. در تابع بی نام زیر، دیگر مرتب سازی بر پایه اندازه شمار کاراکترهای رشته نیست، بلکه بر پایه خود شماره خواهد بود. برای مرتب سازی نزولی، باید پارامتر reverse=True را به تابع ()sorted بفرستید.