فصل ۸: دیکشنریها (Dictionaries) در پایتون

مقدمه
در زبان پایتون، دیکشنریها از مهمترین ساختارهای دادهای هستند که امکان ذخیرهسازی، جستجو و مدیریت دادهها را به صورت جفت کلید و مقدار (Key-Value) فراهم میکنند. شناخت کامل دیکشنریها به شما در مدیریت دادههای پیچیده و ایجاد برنامههای پیشرفتهتر کمک شایانی میکند.
۸.۱ | تعریف دیکشنری در پایتون (What is a Dictionary?)
دیکشنری چیست؟
دیکشنری یک ساختار داده «نگاشت» (mapping) است که هر مقدار را با یک کلید منحصر بهفرد مرتبط میکند. برخلاف لیستها و تاپلها، هر داده در دیکشنری یک “کلید” برای دسترسی سریع اختصاص داده شده است. این کلید باید یکتا (تکرارنشدنی) باشد و مقدار میتواند هر نوع دادهای باشد.
نحوه تعریف دیکشنری
دیکشنریها با استفاده از آکولاد {} و جفت کلید و مقدار تعریف میشوند. هر کلید و مقدار با “:” جدا شده و جفتها با “,” از هم جدا میشوند.
مثال:
my_dict = {
"name": "علی",
"age": 25,
"city": "تهران"
}
در اینجا:
- “name” → کلید، “علی” → مقدار
- “age” → کلید، 25 → مقدار
- “city” → کلید، “تهران” → مقدار
ویژگیهای دیکشنریها
- سریع: بازیابی داده بر اساس کلید بسیار سریعتر از لیستهاست.
- گسترشپذیر: هر مقدار (حتی لیست، دیکشنری، تاپل) میتواند مقدار یک کلید باشد.
- بدون ترتیب تا پایتون ۳.۶: اما از پایتون ۳.۷ به بعد، ترتیب درج کلیدها حفظ میشود.
۸.۲ | دسترسی به مقادیر دیکشنری (Accessing Dictionary Values)
دسترسی به مقدار با کلید
کافیست نام دیکشنری و کلید داخل براکت را بنویسید:
print(my_dict["name"]) # خروجی: علی
print(my_dict["age"]) # خروجی: 25
رفتار در صورت عدم وجود کلید
اگر کلید مورد نظر وجود نداشت، خطای KeyError رخ میدهد:
print(my_dict["job"]) # خطا: KeyError: 'job'
راهکار ایمن (متد get)
برای دسترسی بدون خطا به مقدار و برگرداندن یک مقدار پیشفرض، از متد get() استفاده کنید:
job = my_dict.get("job", "شغلی ثبت نشده")
print(job) # خروجی: شغلی ثبت نشده
بررسی وجود کلید در دیکشنری با in
قبل از دسترسی یا حذف، میتوانید وجود کلید را بررسی کنید:
if "city" in my_dict:
print("شهر:", my_dict["city"])
else:
print("کلید city موجود نیست.")
این روش برای جلوگیری از خطای برنامهنویسی اهمیت دارد.
تمرین ۱
لیستی از دیکشنریها بنویسید که هر دیکشنری نام و سن یک فرد را داشته باشد و سن افراد را چاپ کنید.
پاسخ:
people = [
{"name": "الهام", "age": 21},
{"name": "مهدی", "age": 27}
]
for person in people:
print(person["name"], "سن:", person["age"])
۸.۳ | افزودن، ویرایش و حذف مقادیر در دیکشنریها
افزودن مقدار جدید
به سادگی کافیست کلید جدیدی را مقداردهی کنید:
my_dict["job"] = "برنامهنویس"
print(my_dict)
# خروجی: {'name': 'علی', 'age': 25, 'city': 'تهران', 'job': 'برنامهنویس'}
ویرایش مقدار موجود
مقدار کلید فعلی را بازنویسی میکند:
my_dict["age"] = 26
print(my_dict)
حذف یک کلید و مقدار با del
del my_dict["job"]
print(my_dict)
حذف و گرفتن مقدار حذفشده با pop()
removed_city = my_dict.pop("city")
print(removed_city) # خروجی: تهران
print(my_dict)
حذف همه اعضا با clear()
my_dict.clear()
print(my_dict) # خروجی: {}
ایمنسازی حذف بر پایه وجود کلید
if "job" in my_dict:
del my_dict["job"]
تمرین ۲
یک دیکشنری بسازید، مقدار یکی از کلیدها را تغییر دهید و یکی را حذف کنید، نهایتاً دیکشنری را چاپ کنید.
پاسخ:
data = {"username": "ali", "email": "ali@gmail.com"}
data["email"] = "ali123@gmail.com"
data.pop("username")
print(data)
۸.۴ | پیمایش دیکشنریها (Iterating Over Dictionaries)
دیکشنری ساختار بسیار مناسبی برای پیمایش است. بسته به هدف میتوانید فقط کلیدها، فقط مقادیر یا هر دو را دریافت کنید.
پیمایش فقط بر روی کلیدها (پیشفرض)
for key in my_dict:
print("کلید:", key)
یا
for key in my_dict.keys():
print("Key:", key)
پیمایش مقادیر
for value in my_dict.values():
print("مقدار:", value)
پیمایش بر روی جفت کلید و مقدار
for key, value in my_dict.items():
print("کلید:", key, "مقدار:", value)
پیمایش تو در تو برای دیکشنریهای تو در تو
students = {
"ali": {"age": 20, "grade": 18.5},
"sara": {"age": 19, "grade": 19.2}
}
for name, info in students.items():
print(name, "| سن:", info["age"], "| نمره:", info["grade"])
۸.۵ | متدها و ویژگیهای مفید دیکشنریها
دیکشنریها علاوه بر پایههای ذکرشده، قابلیتهای ارزشمند زیادی برای استفاده حرفهای دارند:
متد get()
دسترسی به مقدار یک کلید (بدون نگرانی از خطا):
value = my_dict.get("age", "سن نامشخص است")
print(value)
متد keys(), values(), items()
print("کلیدها:", list(my_dict.keys())) # ['name', 'age']
print("مقادیر:", list(my_dict.values())) # ['علی', 26]
print("جفت کلید-مقدار:", list(my_dict.items())) # [('name', 'علی'), ('age', 26)]
- خروجی این متدها به صورت object خاص است؛ با
list()قابل تبدیل به لیست معمولیاند.
متد update()
برای بروزرسانی یا افزودن چندین کلید-مقدار به صورت همزمان:
my_dict.update({"email": "ali@gmail.com", "city": "قم"})
کپیکردن دیکشنری
با متد copy()، دیکشنری را مستقل کپی کنید:
new_dict = my_dict.copy()
اگر دیکشنری تو در تو دارید، کپی عمقی نیاز است (deepcopy).
پاکسازی دیکشنری
my_dict.clear() # حذف تمام محتوا
تمرین ۳
برنامهای بنویسید که اطلاعات کامل یک دانشآموز شامل نام، سن و معدل را بگیرد و در یک دیکشنری ذخیره کند، سپس تمام محتوا را نمایش دهد.
پاسخ:
student = {}
student["name"] = input("نام دانشآموز: ")
student["age"] = int(input("سن: "))
student["grade"] = float(input("معدل: "))
print("اطلاعات دانشآموز:", student)
۸.۶ | کاربردهای پیشرفته و نکات حرفهای دیکشنریها
دیکشنریهای تو در تو
برای نگهداری دادههای پیچیدهتر، از دیکشنری تو در تو استفاده میشود:
students = {
"ali": {"age": 20, "courses": ["ریاضی", "فیزیک"] },
"sara": {"age": 19, "courses": ["ادبیات", "شیمی"] }
}
کلیدها و مقادیر قابل قبول
- کلید باید نوع داده immutable داشته باشد (رشته، عدد، تاپل)
- لیست و مجموعه قابل استفاده به عنوان کلید نیستند
حذف مقدار بدون خطا
value = my_dict.pop("key", None) # اگر نبود، None برمیگردد
شمارش اعضا
print("تعداد اعضا:", len(my_dict))
استفاده در شمارش سریع
fruits = ["سیب", "موز", "سیب", "پرتقال", "پرتقال", "سیب"]
counts = {}
for fruit in fruits:
counts[fruit] = counts.get(fruit, 0) + 1
print(counts) # {'سیب':3, 'موز':1, 'پرتقال':2}
۸.۷ | اشتباهات رایج و راهحلها
- استفاده از لیست یا set به عنوان کلید
my_dict[[1,2]] = "Test" # خطا
- دسترسی به کلیدی که وجود ندارد (KeyError)
راهکار: استفاده از get یا بررسی وجود کلید با in - عدم کپی صحیح دیکشنری
dict2 = dict1 # هر تغییری در dict2 روی dict1 هم اثر میگذارد
dict2 = dict1.copy() # صحیح
۸.۸ | سوالات متداول دیکشنریها در پایتون (FAQ)
۱. تفاوت دیکشنری و لیست چیست؟
دیکشنری دادهها را به صورت جفت کلید-مقدار بدون ترتیب ظاهری ذخیره میکند، لیست با ترتیب و فقط مقدار.
۲. آیا مقدار کلید میتواند لیست یا دیکشنری باشد؟
بله؛ اما خود کلید باید نوع immutable مثل رشته یا تاپل باشد.
۳. آیا ترتیب کلیدها حفظ میشود؟
در نسخههای بالاتر پایتون (۳.۷ به بعد) ترتیب حفظ میشود.
۴. چگونه میتوان لیستها را به دیکشنری تبدیل کرد؟
با تابع dict و لیست جفتها:
pair_list = [("name", "رضا"), ("age", 29)]
my_dict = dict(pair_list)
۵. چگونه فهرست کل کلیدها یا مقادیر را میتوان دید؟
با متدهای keys() و values()
۸.۹ | تمرین جامع: ثبت و نمایش اطلاعات کتاب
برنامهای بنویسید که اطلاعات یک کتاب شامل عنوان، نویسنده، سال انتشار را از کاربر بگیرد، در یک دیکشنری ذخیره کند و سپس اطلاعات وارد شده را چاپ نماید.
نمونه پاسخ:
book = {}
book["title"] = input("عنوان کتاب: ")
book["author"] = input("نام نویسنده: ")
book["year"] = int(input("سال انتشار: "))
print("اطلاعات کتاب:")
for key, value in book.items():
print(key, ":", value)
جمعبندی
دیکشنریها بسیار قدرتمندتر و منعطفتر از لیستها و تاپلها در ذخیره دادههای ساختاریافته هستند. تقریباً هر سناریویی که نیازمند نگاشت (mapping) داده به شکل کلید-مقدار است، با دیکشنری بهینه و سریع انجام میشود.
توصیه: زیاد تمرین کنید، با ذخیرهسازی دادههای متنی و عددی در دیکشنریها مهارت خود را افزایش دهید؛ و همواره مراقب باشید کلیدها بدیهی و یکتا باشند تا مدیریت دادهها سادهتر گردد.