بیژن حجازی
بیژن حجازی
خواندن ۲ دقیقه·۳ سال پیش

dict comprehension در پایتان

منظور از comprehension تولید یک iterable جدید بر اساس iterable دیگری هست.
منظور از comprehension تولید یک iterable جدید بر اساس iterable دیگری هست.

مقدمه

مفهوم comprehension در پایتان نه تنها برای list ها بلکه برای dict ها هم کاربرد داره. علاوه بر این میشه با این زبان set ها و generator ها رو هم comprehend کرد. تو این مقاله میخایم یک dict رو comprehend کنیم.

فلسفه

با این روش میشه چندین خط کد رو توی یک خط نوشت. مثلا با استفاده از comprehension می تونیم بر اساس یک iterable (یعنی هر چیزی که بشه توش چرخید مثل list, tuple, set, range و ...) لیست جدیدی درست کنیم.

dict comprehension

دیکشنری های زبان پایتان رو میشه با استفاده از comprehension درست کرد. برای این کار نیاز به چند تا چیز داریم:

  • یک iterable شامل key ها
  • یک iterable شامل value ها
  • تابع zip

مثال کشور - پایتخت

توی مثال زیر یک tuple از اسامی کشور ها و یک list از اسامی پایتخت ها داریم که متناظر هم هستن. یعنی مثلا اگه عنصر اول tuple مون France باشه عنصر اول list مون میشه Paris. حالا میخایم یک dict بر اساس این دو تا iterable درست کنیم که key هاش اسامی کشور ها و value هاش اسامی پایتخت هاشون باشه.

countries = (&quotFrance&quot,&quotGermany&quot,&quotItaly&quot,&quotEngland&quot) capitals = [&quotParis&quot,&quotBerlin&quot,&quotRome&quot,&quotLondon&quot]

نکته: از دستی دو تا 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 نهایی حساب نخواهند شد.

تبدیل حین 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 != &quotEngland&quot}

نتیجه گیری

تو زبان پایتان comprehension یک میانبر خیلی ساده و راحته که از حلقه نویسی هایی مثل for و while خودداری کنی. شاید در نگاه اول خیلی ضروری به نظر نیاد ولی وقتی درگیر پروژه های بزرگ میشی تسلط به این میانبر ها خیلی در سرعت کد نویسی ات موثره و همین طور باعث میشه که خطاگیریت خیلی راحت تره بشه چون:

کد کوتاه تر = باگ کمتر = باگ گیری کمتر
برنامه نویسیپایتانپایتونکدنویسیتوسعه وب
سلام! نوشتن به منزله مطالعه «خود» هست. من بیشتر تو زمینه برنامه نویسی و روان شناسی مطلب میذارم. خوشحال میشم نظرات تون رو باهام در میون بذارین.
شاید از این پست‌ها خوشتان بیاید