در آموزش گذشته آشنایی مختصری با نوع دادۀ دیکشنری پیدا کرده و دیدیم که عملکرد آبجکتهایی از این نوع همانند لغتنامهها در دنیای واقعی میباشد بدین معنی که همچون لغات و معنای معادل آنها، حاوی جفتهای مختلفی از کلیدها و مقادیر متناظرشان هستند.
در حقیقت، هدف از بهکارگیری دیتا تایپ دیکشنری تسهیل دستیابی به یک مقدار یا جستجوی آن با استفاده از کلید متناظرش است مضاف بر اینکه دیکشنری همچون دیتا تایپ لیست به اصطلاح 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
افزوده شده است.