دیکشنریها: پیدا کردن با اسم (Dictionaries)
دیکشنری جفتهای کلید و مقدار نگه میداره، که چیزها رو با یه اسم پیدا کنی نه با جاشون. ورودیها رو اضافه و بهروز میکنی، روشون حلقه میزنی و با get از KeyError فرار میکنی.
کلید و مقدار
جفتها توی آکولاد
prices = {"tea": 3, "cake": 5, "milk": 2} یه دیکشنری با سه تا جفت میسازه. هر جفت یه کلید (key)ـه، یه دونقطه، و مقدار (value)ـش، و جفتها با کاما از هم جدا میشن. یه مقدار رو با گذاشتن کلیدش توی کروشه پیدا میکنی: prices["cake"] میشه 5. کلیدها تکراری نمیشن: هر کلید، یه مقدار. len(prices) تعداد جفتها رو میشمره.
دفترچه تلفن یه دیکشنریه: اسم کلیده، شماره مقداره. هیچوقت نمیپرسی «شمارهی دویست و چهاردهم»؛ شمارهی رضا رو میپرسی.
prices = {"tea": 3, "cake": 5, "milk": 2}
print(prices["cake"])
print(prices["tea"] * 2)
print(len(prices))5
6
3prices["cake"] وقتی پیدا شد فقط یه عدده، پس میتونی باهاش حساب کنی. len سه تا جفت میشمره، نه شش تا چیز.
خودت رو امتحان کن
با prices = {"tea": 3, "cake": 5, "milk": 2}، دستور prices[0] جفت اول، یعنی tea، رو میده.
جواب رو ببین
نادرست
غلطه. دیکشنری جا یا شماره نداره. prices[0] دنبال کلیدی میگرده که خود عدد 0 باشه، پیدا نمیکنه و KeyError: 0 میده. برای قیمت tea، با کلیدش بپرس: prices["tea"].
قدمبهقدم ببین

prices: سه تا کلید، سه تا مقدار دیکشنری prices به شکل یه جدول دوستونه کشیده شده. سمت چپ کلیدها هستن، "tea" و "cake" و "milk"؛ سمت راست، با یه خط کوتاه وصلشده، مقداری که مال هر کدومه: 3، 5 و 2.

prices["cake"] ردیف cake رو روشن میکنه و 5 رو بیرون میاره جستوجوی prices["cake"] ردیفی رو پیدا میکنه که کلیدش "cake"ـه. اون کلید و مقدارش روشن میشن و 5 با یه فلش بیرون کشیده میشه. پایتون با اسم کلید پیداش کرد، بدون شمردن ردیفها.

tea به 4 عوض شد، jam با 6 اضافه شد prices["tea"] = 4 مقدار قبلی tea رو عوض میکنه، پس ردیفش حالا بهجای 3 عدد 4 رو نشون میده. prices["jam"] = 6 از کلیدی استفاده میکنه که وجود نداشت، پس یه ردیف جدید "jam" با 6 پایین جدول ظاهر میشه. هر دو بار همون نوشتار: اگه کلید باشه بهروزش میکنه، اگه نباشه اضافهش میکنه.

prices["coffee"] یعنی KeyError؛ get عدد 0 میده prices["coffee"] بین کلیدها میگرده و به یه جای خالیِ خطچین میرسه: "coffee" وجود نداره، پس کروشه خطای KeyError میده. زیرش، prices.get("coffee", 0) همون سؤال رو میپرسه ولی بهجای متوقف کردن برنامه، مقدار پیشفرض یعنی 0 رو پس میده.
خودت رو امتحان کن
prices = {"tea": 3, "cake": 5}
prices["tea"] = 4
print(prices["tea"] + prices["cake"])9812KeyError: 'tea'
جواب رو ببین
9درسته. خط دوم 3ِ tea رو با 4 عوض میکنه، پس میشه 4 + 5 = 9.
prices = {"tea": 3, "cake": 5}
prices["tea"] = 4
prices["jam"] = 6
print(prices){'tea': 4, 'cake': 5, 'jam': 6}چاپ کل یه دیکشنری همهی جفتها رو نشون میده و رشتهها رو با گیومهی تکی. از پایتون 3.7 به بعد، دیکشنری ترتیبی رو که جفتها اضافه شدن نگه میداره، برای همین jam آخر میاد.
prices = {"tea": 3, "cake": 5}
print("coffee" in prices)
print(prices.get("coffee", 0))
print(prices.get("cake", 0))
print(prices.get("coffee"))False
0
5
Noneهیچکدوم از این خطها برنامه رو نمیخوابونه. get فقط وقتی کلید نباشه از پیشفرض استفاده میکنه؛ برای cake همون مقدار واقعی، یعنی 5، رو برمیگردونه.
خودت رو امتحان کن
prices کلیدهای tea و cake رو داره ولی coffee نداره. prices.get("coffee", 0) چی میده؟
- یه KeyError
- 0
- None
- False
جواب رو ببین
0
درسته. کلید وجود نداره، پس get همون پیشفرضی رو که بهش دادی پس میده، یعنی 0.
prices = {"tea": 3, "cake": 5}
for item, price in prices.items():
print(item, price)tea 3
cake 5items() جفتها رو یکییکی میده و حلقه هر جفت رو توی دو تا اسم باز میکنه. یه for k in prices: ساده فقط روی کلیدها حلقه میزنه.
الگوی شمردن
- با یه دیکشنری خالی شروع کن
counts = {} قبل از حلقه. قراره نگه داره هر کلمه چند بار اومده.
- روی آیتمها حلقه بزن
for w in words: بهترتیب "tea"، "cake"، "tea" رو میبینه.
- به شمارش اون کلمه یکی اضافه کن
counts[w] = counts.get(w, 0) + 1. اولین باری که یه کلمه میاد، get عدد 0 رو میده، پس میشه 1؛ از اون به بعد به همون قبلی اضافه میکنه.
- بعد از حلقه چاپ کن
print(counts) نشون میده {'tea': 2, 'cake': 1}. پروژهی آخر دقیقاً با همین شکل خرجها رو جمع میزنه.
خودت رو امتحان کن
words = ["a", "b", "a", "a"]
counts = {}
for w in words:
counts[w] = counts.get(w, 0) + 1
print(counts){'a': 3, 'b': 1}{'a': 1, 'b': 1}{'a': 3, 'b': 1, 'a': 1}KeyError: 'a'
جواب رو ببین
{'a': 3, 'b': 1}درسته. a سه بار دیده میشه و b یه بار. همون get(w, 0) جلوی KeyError رو میگیره وقتی هر حرف بار اول میاد.
لیست یا دیکشنری؟
لیست
وقتی ترتیب و جا مهمه: یه صف، قدمها به ترتیب، نمرهها به همون ترتیبی که گرفته شدن.
میپرسی «آیتم 0 چیه؟»
دیکشنری
وقتی چیزها رو با یه اسم پیدا میکنی: قیمت هر جنس، شمارهی هر آدم، تعداد هر کلمه.
میپرسی «cake چنده؟»
خودت رو امتحان کن
برای هر کار، لیست بهتره یا دیکشنری؟
- لیست خرید به همون ترتیبی که توی مغازه راه میری
- شمارهی دوستها، که با اسم پیداشون میکنی
- نمرههای امتحان به ترتیبی که گرفته شدن
- قیمت هر چیز توی منوی یه کافه
- اینکه هر کلمه چند بار توی یه متن اومده
جواب رو ببین
لیست: لیست خرید به همون ترتیبی که توی مغازه راه میری, نمرههای امتحان به ترتیبی که گرفته شدن
دیکشنری: شمارهی دوستها، که با اسم پیداشون میکنی, قیمت هر چیز توی منوی یه کافه, اینکه هر کلمه چند بار توی یه متن اومده
مرور درس
- دیکشنری جفتهای key: value رو توی آکولاد نگه میداره، و prices["cake"] یه مقدار رو با کلیدش پیدا میکنه.
- جا یا شمارهای در کار نیست: prices[0] دنبال کلید 0 میگرده، نه جفت اول.
- مقدار دادن به یه کلید، اگه باشه بهروزش میکنه و اگه نباشه اضافهش میکنه؛ کلیدها تکراری نمیشن.
- کلید ناموجود با کروشه یعنی KeyError؛ با in چک کن، یا برای جواب امن از get(key, default) استفاده کن.
- روی جفتها با for k, v in d.items() حلقه بزن، و چیزها رو با d[k] = d.get(k, 0) + 1 بشمر.