۱۶ ترفند دیکشنری پایتون برای توسعه دهندگان با مهارت متوسط | راهنمای کاربردی


دیکشنریها قلب و جان پایتون محسوب میشوند. در این مقاله در مورد 16 ترفند دیکشنری پایتون صحبت خواهیم کرد که به توسعهدهندگان با سطح مهارت متوسط کمک میکنند تا کدهای خود را به میزان زیادی ارتقا بخشیده و فرایند کدنویسی خود را بهمراتب آسانتر و سریعتر انجام دهند. قطعه کدهایی که در این مقاله ارائه شدهاند، همگی با پایتون نسخه 3.7 تست شدهاند.
پرینت همه جفتهای کلید: مقدار در دیکشنریهای تودرتو
این یک راهحل بازگشتی برای پرینت کردن همه جفتهای کلید: مقدار در یک دیکشنری است که وجود لیستها، مجموعهها و چندتاییها را در یک مقدار نیز مدیریت میکند:
خروجی کد فوق چنین است:
مرتبسازی یک دیکشنری
از پایتون نسخه 3.6 به بعد، دیکشنریها به صورت پیشفرض ترتیب درج را حفظ میکنند. با این حال هنوز از امکان مرتبسازی پشتیبانی نمیکنند.
امکان دریافت یک دنباله تکرارپذیر از جفتهای کلید: مقدار دیکشنری به صورت دنبالهای از چندتاییها وجود دارد. سپس میتوانیم این لیست از چندتاییها را مجدداً به یک دیکشنری تبدیل کنیم تا ترتیب درج حفظ شود.
ادغام دو دیکشنری
از پایتون نسخه 3.9 به بعد، عملگر ادغام | برای دیکشنریها ارائه شده است. تا این زمان میتوانستید از روش ادغام کپی سطحی استفاده کنید.
ساخت دیکشنری از دو لیست
ما میتوانیم دو لیست را از یک دنباله از چندتاییها zip کنیم و آن را به سازنده dict() بفرستیم:
دریافت همه آیتمها بر اساس کلید در یک دیکشنری تودرتو
به این منظور دوباره از روش بازگشتی استفاده میکنیم. توجه کنید که کتابخانههای خوبی در پایتون وجود دارند که میتوانید به روش عبارتهای مسیر عمل کنید:
دریافت همه آیتمها بر اساس مقدار در دیکشنری تودرتو
طرز کار این مثال همانند ترفند قبلی است. توجه داشته باشید که ما از yield برای ساخت یک تکرارکننده استفاده کردهایم. خط 32 همه اجراهای منفرد yield را به یک لیست کاهش میدهد:
ایجاد دیکشنری با استفاده از خلاصهسازی دیکشنری
«خلاصهسازی دیکشنری» (Dictionary Comprehension) از سازنده {key: value} با یک حلقه for روی یک دنباله استفاده میکند:
استفاده از مقادیر پیشفرض برای آیتمهای جدید
Defaultdict در مواردی که بخواهیم مقادیر را به یک کلید موجود الحاق کنیم به طوری که بازنویسی نشود، بسیار مفید خواهد بود. به طور معمول خط شماره 9 یک خطا ایجاد میکند، زیرا مقدار موجود در این کلید نمیتواند یک لیست باشد و باید None باشد. از این رو نمیتوانستیم از append استفاده کنیم.
تبدیل لیستی از چندتاییها به دیکشنری
در این مورد نیز از یک defaultdict استفاده میکنیم، اما این بار مقدار پیشفرض یک دیکشنری است.
ایجاد یک دیکشنری از فایل CSV با عناوین ستون
به این منظور از اختراع مجدد چرخ خودداری کرده و از ماژول CSV کمک میگیریم.
حذف آیتم از دیکشنری
با استفاده از متد pop() میتوانید یک آیتم دیکشنری را حذف کرده و مقدار آن را بازیابی کنید.
ایجاد کپی عمیق از دیکشنری
با استفاده از تابع deepcopy در ماژول copy میتوانید یک کپی واقعی از یک دیکشنری بسازید که شامل اشیای تغییرپذیر مانند یک لیست باشد.
معکوس ساختن کلیدها و مقادیر
این ترفند نیز ممکن است یک روز به کارتان بیاید. در این راهحل از یک خلاصهسازی دیکشنری استفاده شده است.
ذخیره چندین دیکشنری در یک فایل
به جای استفاده از pickle برای ذخیره یک شیء در یک فایل میتوانید از shelve برای ذخیره چند شیء در فایل استفاده کنید.
تبدیل دیکشنری به JSON
کاری آسانتر از این در پایتون وجود ندارد. مثالهایی از این مورد را در ترفندهای شماره 6 و 10 این مطلب مشاهده کردیم. به جز در مواردی که دیکشنری شما شامل کلاسهای تعریف شده از سوی کاربر، اشیای datetime، مجموعه (set) یا دیگر اشیای پایتون باشد، میتوانید از این روش استفاده کنید.
در این حالت یک زیرکلاس از شیء JSONEncoder به دست میآید که مورد خاص ما را به روش متفاوتی مدیریت میکند. در خط 12 از «نوعبندی اردکی» (duck typing) استفاده کردهایم. قصد ما این است که ببینیم آیا شیء به صورت یک دنباله تکرارپذیر عمل میکند یا نه تا در این صورت آن را به یک لیست تبدیل کنیم. اگر شیئی یک تکرارپذیر (iterable) نداشته باشد، یک استثنا ایجاد میشود که در خط 16 نادیده گرفته شده است.
حذف چندین آیتم از دیکشنری در طی تکرار
در پایتون 3 متد items() یک تکرارکننده (iterator) بازگشت میدهد. بنابراین تلاش برای حذف یک آیتم منجر به ایجاد یک «خطای زمان اجرا» (RuntimeError) میشود. ما با یادداشتبرداری موقت از همه آیتمهایی که قرار است حذف شوند، میتوانیم از بروز این خطا جلوگیری کنیم. در مثال زیر همه آیتمهایی که مقدارشان عدد زوج است حذف میشوند.
سخن پایانی
امیدواریم این مطلب مورد توجه شما قرار گرفته باشد. هر گونه دیدگاه یا پیشنهاد خود را در مورد موضوع این مطلب در بخش نظرات این نوشته با ما و دیگر خوانندگان مجله فرادرس در میان بگذارید.