مفهوم comprehension در پایتان نه تنها برای list ها بلکه برای dict ها هم کاربرد داره. علاوه بر این میشه با این زبان set ها و generator ها رو هم comprehend کرد. تو این مقاله میخایم یک dict رو comprehend کنیم.
با این روش میشه چندین خط کد رو توی یک خط نوشت. مثلا با استفاده از comprehension می تونیم بر اساس یک iterable (یعنی هر چیزی که بشه توش چرخید مثل list, tuple, set, range و ...) لیست جدیدی درست کنیم.
دیکشنری های زبان پایتان رو میشه با استفاده از comprehension درست کرد. برای این کار نیاز به چند تا چیز داریم:
توی مثال زیر یک tuple از اسامی کشور ها و یک list از اسامی پایتخت ها داریم که متناظر هم هستن. یعنی مثلا اگه عنصر اول tuple مون France باشه عنصر اول list مون میشه Paris. حالا میخایم یک dict بر اساس این دو تا iterable درست کنیم که key هاش اسامی کشور ها و value هاش اسامی پایتخت هاشون باشه.
countries = ("France","Germany","Italy","England") capitals = ["Paris","Berlin","Rome","London"]
نکته: از دستی دو تا iterable از جنس های متفاوت آوردم که یادت بمونه توی comprehension فرقی نداره از چه iterable ای استفاده کنیم. البته حواست باشه چون set ها order ندارن به ترتیب مد نظرت تولید نمیشه!
در گام بعدی نیاز داریم که این دو تا iterable رو با هم ترکیب کنیم یعنی عناصرشون رو جفت به جفت در کنار هم قرار بدیم. این کار رو با تابع zip می کنیم:
pairs = zip(countries, capitals)
تابع zip به ما یک iterable از tuple میده. هر tuple دو عضو داره که عضو اول از countries برداشته شده و به عنوان key کار خواهد کرد و عضو دوم از capitals برداشته شده و به عنوان vaule کار خواهد کرد.
در نهایت نوبت به خود comprehension میرسه. تو کد زیر منظور از k همون key و منظور از v همون value عه.
my_dict = {k:v for (k, v) in pairs}
حالا اگه my_dict رو پرینت بگیریم مشاهده می کنیم که یک dict عه که key هاش اسامی کشور ها و value هاش اسامی پایتخت هاشونه.
نکته: اگه تعداد عناصر دو تا iterable اولیه مون برابر با هم نباشه، اون عناصر اضافه از حاصل تابع zip حذف میشن و توی comprehension نهایی حساب نخواهند شد.
میشه همزمان با تولید dict روی عناصر iterable مون محاسبات انجام بدیم. مثلا:
my_dict = {k.lower():v.upper() for (k, v) in pairs}
میشه با اضافه کردن یک شرط به comprehension مون تولید جفت های k:v رو مشروط کنیم. مثلا:
my_dict = {k:v for (k, v) in pairs if k != "England"}
تو زبان پایتان comprehension یک میانبر خیلی ساده و راحته که از حلقه نویسی هایی مثل for و while خودداری کنی. شاید در نگاه اول خیلی ضروری به نظر نیاد ولی وقتی درگیر پروژه های بزرگ میشی تسلط به این میانبر ها خیلی در سرعت کد نویسی ات موثره و همین طور باعث میشه که خطاگیریت خیلی راحت تره بشه چون:
کد کوتاه تر = باگ کمتر = باگ گیری کمتر