دیکشنریها
در این درس دیکشنری میسازید، با کلید مقدار میخوانید و مینویسید، متد get را برای کلیدهای ناموجود به کار میبرید و دیکشنری را پیمایش میکنید.
آنچه در این درس میآموزید
- دیکشنری بسازید و با کلید مقدار بخوانید و بنویسید
- تفاوت دسترسی مستقیم و متد get را تشخیص دهید
- دیکشنری را با items پیمایش کنید و ساختار تودرتو را بخوانید
فهرست مطالب
لیست عضوهایش را با شماره جایگاه میشناسد: عضو اول، عضو دوم و بعد. اما در دنیای واقعی بیشتر با نام به داده رجوع میکنیم؛ شمارهٔ تماس «سارا»، قیمت «کتاب»، سن «کاربر». دیکشنری (Dictionary) ساختاری است که هر مقدار را به یک کلید (Key) میبندد و بهجای اندیس عددی، با همان کلید به داده دسترسی میدهد. هر جا رابطهٔ «نام ← مقدار» دارید، از اطلاعات کاربر تا شمارش کلمهها، دیکشنری ابزار درست است.
در این درس دیکشنری میسازید، با کلید مقدار میخوانید و مینویسید و کل ساختار را پیمایش میکنید.
ساخت دیکشنری و دسترسی با کلید
دیکشنری با آکولاد ساخته میشود و هر جفت «کلید: مقدار» با ویرگول از جفت بعدی جدا میشود:
contact = {"name": "Sara", "age": 25}
print(contact["name"])
print(contact["age"])Sara 25
دسترسی با کروشه انجام میشود، ولی داخل کروشه کلید است نه اندیس. کلید در این مثال رشته است؛ عدد و تاپل هم میتوانند کلید باشند.
کلید ناموجود و متد get
اگر کلید در دیکشنری نباشد، دسترسی مستقیم با کروشه خطا میدهد:
contact = {"name": "Sara"}
print(contact["phone"])KeyError: 'phone'
متد get همین دسترسی را با مهربانی بیشتری انجام میدهد: برای کلید ناموجود خطا نمیدهد، بلکه None برمیگرداند؛ و اگر مقدار جایگزین بدهید، همان را:
contact = {"name": "Sara"}
print(contact.get("phone"))
print(contact.get("phone", "Not found"))None Not found
افزودن، تغییر و حذف
دیکشنری تغییرپذیر است. برای افزودن یا تغییر، فقط به کلید مقدار تخصیص میدهید؛ پایتون خودش میفهمد کلید تازه است یا قبلی:
inventory = {"pen": 4}
inventory["book"] = 2
inventory["pen"] = 9
print(inventory){'pen': 9, 'book': 2}
کلید pen از قبل بود و مقدارش بهروز شد؛ کلید book تازه بود و اضافه شد. حذف هم با دستور del انجام میشود: del inventory["book"] آن جفت را پاک میکند.
پیمایش دیکشنری
برای گذر از همهٔ جفتها، متد items به کار میآید:
prices = {"book": 90, "pen": 20}
for key, value in prices.items():
print(key, value)
print("book" in prices)
print("bag" in prices)book 90 pen 20 True False
متد items هر جفت را به شکل تاپل میدهد و unpacking درس قبل آن را در یک سطر به دو متغیر key و value میشکند. عملگر in روی دیکشنری کلیدها را میآزماید؛ و چون دیکشنری بر پایهٔ جدول هش کار میکند، این آزمون حتی در دیکشنریهای بسیار بزرگ هم سریع میماند.
دیکشنری تودرتو
مقدار دیکشنری میتواند خودش دیکشنری باشد؛ اینطور دادههای ساختیافته مثل اطلاعات کاربرها را راحت مدل میکنید:
users = {"sara": {"age": 25, "city": "Tehran"}}
print(users["sara"]["city"])Tehran
دو کروشه پشت سر هم: اول کلید بیرونی، بعد کلید درونی. همین الگو تا هر عمقی ادامه دارد.
تمرینها
تمرین
تمرین ۱ — شمارش تکرارها
تابعی به نام count_items بنویسید که لیستی از مقادیر بگیرد و دیکشنریای برگرداند که هر مقدار را به تعداد تکرارش نگاشت کند؛ برای ["آب", "چای", "آب"] نتیجه باید {'آب': 2, 'چای': 1} شود. راهنمایی: متد get با مقدار پیشفرض صفر، این تابع را کوتاه نگه میدارد.
# Write your code hereنمایش راهحل
def count_items(items):
counts = {}
for item in items:
counts[item] = counts.get(item, 0) + 1
return counts
print(count_items(["water", "tea", "water"])){'water': 2, 'tea': 1}
::: :::
خلاصه
- دیکشنری داده را با کلید نگه میدارد؛ خواندن و نوشتن با کروشه و کلید انجام میشود.
- دسترسی مستقیم به کلید ناموجود خطای KeyError میدهد؛
getبهجایشNoneیا مقدار پیشفرض برمیگرداند. - تخصیص به کلید تازه یعنی افزودن و به کلید موجود یعنی بهروزرسانی؛ حذف با
delاست. itemsجفتها را برای پیمایش میدهد وinوجود کلید را سریع میآزماید.- کلید باید تغییرناپذیر باشد: رشته، عدد و تاپل مجازند، لیست نه.
مجموعههای دادهٔ پایتون یک عضو دیگر هم دارند: ساختاری که نه اندیس دارد نه کلید؛ فقط اعضای یکتا. در درس بعدی با مجموعه آشنا میشویم.