آشنایی با دیتا تایپ دیکشنری در زبان برنامه‌نویسی پایتون


در آموزش گذشته آشنایی مختصری با نوع دادۀ دیکشنری پیدا کرده و دیدیم که عملکرد آبجکت‌هایی از این نوع همانند لغت‌نامه‌ها در دنیای واقعی می‌باشد بدین معنی که همچون لغات و معنای معادل آن‌ها، حاوی جفت‌های مختلفی از کلیدها و مقادیر متناظرشان هستند.

در حقیقت، هدف از به‌کارگیری دیتا تایپ دیکشنری تسهیل دست‌یابی به یک مقدار یا جستجوی آن با استفاده از کلید متناظرش است مضاف بر اینکه دیکشنری همچون دیتا تایپ لیست به اصطلاح Mutable است و از همین روی برنامه‌نویسان می‌توانند بر اساس نیاز خود محتوای آن را تغییر دهند (به منظور کسب اطلاعات بیشتر در رابطه با آبجکت‌های تغییرپذیر به آموزش آشنایی با مفاهیم Mutable و Immutable بودن برخی دیتا تایپ‌ها در پایتون مراجعه کنید.)

لازم به یادآوری است که پروسهٔ ساخت یک آبجکت از نوع دیکشنری مشابه ایجاد یک لیست است با این تفاوت که تمامی آیتم‌های موجود در داخل آن باید به فرم یک جفت key:value باشند که به عنوان مثال داریم:

menu = {"breakfast":"egg", "lunch":"rice", "dinner":"salad"}

در دستور فوق یک آبجکت از نوع دیکشنری تحت عنوان menu تعریف کرده‌ایم که آیتم‌های داخل آن به صورت «کلید و مقدار» ذخیره شده‌اند به طوری که ابتدا کلید و در ادامه علامت : و به دنبال آن مقدار منتسب به کلید را آورده‌ایم و همان‌طور که می‌بینید، در مثال فوق کلیدها از جنس استرینگ هستند.

معیارهای انتخاب کلید
به طور کلی، چند قاعدۀ مشخص به منظور انتخاب کلیدها در دیتا تایپ دیکشنری وجود دارد که برخی از مهم‌ترین آن‌ها عبارتند از:

- قانون اول اینکه کلیدها باید منحصربه‌فرد باشند. برای نمونه، در مثال فوق دو کلید با شناسۀ یکسان breakfast نمی‌توانیم داشته باشیم چرا که در این صورت مفسر پایتون آخرین مقدار منتسب به کلید مذکور را مد نظر قرار می‌دهد و سایر مقادیر را نادیده می‌گیرد که از همین روی بهتر است مقادیر یونیک (منحصربه‌فرد) برای هر یک از کلیدها انتخاب کنیم.
- قانون دوم نیز به بیان این موضوع اختصاص دارد که کلیدها را باید از نوع آبجکت‌های تغییرناپذیر تعریف کرد. برای نمونه، در مثال فوق دیتا تایپ کلیدها را از نوع استرینگ انتخاب کردیم و همان‌طور که پیش از این اشاره کردیم، استرینگ‌ها آبجکت‌هایی تغییرناپذیر در زبان پایتون به شمار می‌روند.  

حال به منظور درک بهتر این موضوع، در ادامه به بررسی برخی کاربردهای دیتا تایپ دیکشنری و فانکشن‌های مورد استفاده در آن می‌پردازیم. در واقع، به منظور دسترسی به تمامی محتوای دیکشنری‌ها به صورت زیر عمل می‌کنیم:

>>> menu = {"breakfast":"egg", "lunch":"rice", "dinner":"salad"}
>>> menu
{'breakfast': 'egg', 'lunch': 'rice', 'dinner': 'salad'}

همان‌طور که ملاحظه می‌کنید، آبجکتی از نوع دیکشنری تعریف کرده‌ایم که کلیدها و مقادیر متناظرشان را با علامت : در کنار هم قرار داده‌ایم و با به‌کارگیری نام منتسب به دیکشنری مذکور، تمامی محتوای آبجکت مد نظر در خروجی ریترن شده است اما این در حالی است که اگر بخواهیم به یک مقدار خاص از دیکشنری مد نظر دست پیدا کنیم، صرفاً کافی است تا نام کلید متناظر آن را به صورت زیر به کار گیریم:

>>> menu['lunch']
'rice'

در واقع، ابتدا شناسۀ منتسب به آبجکت دیکشنری را آورده‌ایم سپس کلید مد نظر را در میان علائم [ ] قرار داده‌ایم که بدین ترتیب مقدار منتسب به کلید lunch از دیکشنری menu در خروجی ریترن شده است. همچنین به منظور دست‌یابی به تمامی کلیدهای به کار گرفته شده در یک آبجکت از نوع دیکشنری می‌توانیم فانکشن از پیش تعریف‌شدۀ ()keys را مورد استفاده قرار دهیم که برای مثال داریم:

>>> menu.keys()
dict_keys(['breakfast', 'lunch', 'dinner', 'snack'])

همان‌طور که می‌بینید، فانکشن ()keys را روی آبجکت menu فراخوانی کرده‌ایم و خروجی حاصل از آن لیستی متشکل از تمامی کلیدهای تعریف‌شده در آبجکت menu می‌باشد. برای دست‌یابی به مقادیر مربوط به هر یک از کلیدهای دیکشنری مد نظر نیز می‌توانیم از حلقۀ for و کلمۀ کلیدی in به منظور پیمایش آیتم‌های داخل آن استفاده کنیم که برای درک بهتر این موضوع کد زیر را مد نظر قرار می‌دهیم:

>>> for item in menu.keys():
        print ("We have " + menu[item] + " for " + item + ".")

در کد فوق متغیری به نام item تعریف کرده‌ایم که قرار است تا هر یک از کلیدهای تعریف‌شده در دیکشنری menu را نگهداری کند و در ادامه با به‌کارگیری کلمۀ کلیدی in و فراخوانی فانکشن ()keys روی آبجکت menu گفته‌ایم به ازای هر یک از کلیدهای داخل دیکشنری menu دستورات بدنۀ داخلی for اجرا شود بدین ترتیب هر یک از کلیدهای آبجکت menu یک‌به‌یک به متغیر item منتسب می‌شوند و در ادامه مقدار متناظر هر کلید از طریق دستور [menu[item به همراه کلید مد نظر با استرینگ فوق کانکت شده و در خروجی چاپ می‌شود که با اجرای کد فوق در خروجی خواهیم داشت:

We have egg for breakfast.
We have rice for lunch.
We have salad for dinner.

در واقع، حلقۀ for به ازای هر یک از کلیدهای آبجکت menu تکرار شده و آن‌ها را به همراه مقادیر متناظرشان با استرینگ تعریف‌شده کانکت کرده و با استفاده از فانکشن ()print در خروجی چاپ می‌کند. همان‌طور که پیش‌تر اشاره کردیم، دیتا تایپ دیکشنری تغییرپذیر است که برای درک بهتر این مفهوم قصد داریم تا در ادامه یکسری تغییر در آبجکت menu اِعمال کنیم که برای این منظور خواهیم داشت:

>>> menu["lunch"] = "meat"
>>> menu
{'breakfast': 'egg', 'lunch': 'meat', 'dinner': 'salad'}

در کد فوق نام کلید مد نظر از آبجکت menu را داخل علائم [ ] قرار داده‌ایم و بدین ترتیب به مقدار متناظر کلید مذکور دسترسی داریم و در ادامه گفته‌ایم این مقدار معادل استرینگ «meat» قرار گیرد. در واقع، با به‌کارگیری دستور فوق مقدار متناظر از آیتم مربوط به کلید lunch را از استرینگ «rice» به «meat» تغییر دادیم.

همچنین به منظور ایجاد تغییر در محتوای مربوط به بیش از یک آیتم از دیکشنری می‌توان فانکشن از پیش تعریف‌شدۀ ()update را مورد استفاده قرار داد. در واقع، فانکشن ()update روی دیکشنری‌ها با حداقل یک آرگومان ورودی فراخوانی می‌شود بدین صورت که حداقل یک جفت key:value متناظر آن را می‌گیرد و چنانچه کلیدهای مربوط به آرگومان ورودی در آبجکت دیکشنری وجود داشته باشند، مقدار جدید تعریف‌شده در آرگومان ورودی جایگزین مقدار اصلی در آبجکت دیکشنری می‌گردد و در غیر این صورت آیتم جدید را با به‌کارگیری «کلید و مقدار» جدید به دیکشنری مد نظر اضافه می‌کند که به عنوان یک نمونه از کاربرد این فانکشن خواهیم داشت:

>>> menu.update({"breakfast":"milk" , "snack":"nut"})
>>> menu
{'breakfast': 'milk', 'lunch': 'meat', 'dinner': 'salad', 'snack': 'nut'}

در کد فوق فانکشن ()update را با دو آرگومان ورودی روی آبجکت menu فراخوانی کرده‌ایم که در آن هر یک از کلیدهای مربوط به آرگومان ورودی به ترتیب معادل استرینگ‌های «breakfast» و «snack» می‌باشد که آیتمی با کلید breakfast در آبجکت اصلی موجود بوده و از همین روی مقدار جدید جایگزین مقدار اصلی در آبجکت مذکور می‌شود اما این در حالی است که آیتمی با کلید snack در آبجکت menu وجود ندارد و بدین ترتیب فانکشن ()update منجر به ایجاد آیتمی جدید با کلید snack و مقداری برابر با استرینگ «nut» در این آبجکت شده و همان‌طور که می‌بینید مقدار مربوط به کلید breakfast تغییر یافته و همچنین آیتمی جدید نیز به انتهای محتوای آبجکت menu افزوده شده است.


لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۷/۰۵/۲۱
سلام چرا توی کد زیر از ()keys استفاده کردید؟
:()for item in menu.keys
("." + print ("We have " + menu[item] + " for " + item
بدون استفاده از keys نتیجه هیچ فرقی نمیکنه
محمدهادی
محمدهادی
۱۳۹۵/۰۸/۲۷
انقد قابلیت های پایتون زیاد شده و هرکاری میتونی با اشیا بکنی که وقتی در عمل میخوای یک برنامه بنویسی ، یادت میره که چنین قابلیتایی وجود داره و ازش استفاده کنی!
پایتون وقتی خوبه که از این قابلیتاش استفاده کنی. انقد باید تمرین کنی که ملکه ی ذهن باشه. و اینکه نباید برای ی مدت کنار بذاریو دوباره برگردی.
دارم به خودم میگم اینارو :| :|