دیکشنری و مجموعه
دیکشنری و مجموعه دو ساختار داده فوقالعاده مفید هستند. دیکشنری برای ذخیره دادههای کلید-مقدار و مجموعه برای ذخیره مقادیر یکتا.
دیکشنری و مجموعه دو ساختار داده فوقالعاده مفید هستند. دیکشنری برای ذخیره دادههای کلید-مقدار و مجموعه برای ذخیره مقادیر یکتا.
دیکشنری (Dictionary)
دیکشنری مجموعهای از جفتهای کلید: مقدار است:
# ساخت دیکشنری
person = {
"name": "محمدعلی",
"age": 35,
"city": "کاشان",
"is_developer": True
}
# دسترسی
print(person["name"]) # محمدعلی
# اصلاح
person["age"] = 36
# اضافه کردن کلید جدید
person["email"] = "ali@example.com"
# روش جایگزین ساخت
empty = {}
also_empty = dict()
from_pairs = dict(name="علی", age=25) # {'name':'علی', 'age':25}
from_list = dict([("a", 1), ("b", 2)]) # {'a':1, 'b':2}
قواعد کلیدها
- کلید باید تغییرناپذیر باشد:
str،int،float،tuple✅ listیاdictنمیتواند کلید باشد ❌- کلیدها باید یکتا باشند (تکرار، مقدار قبلی را عوض میکند)
# کلیدهای مختلف
mixed = {
"name": "علی",
42: "عدد",
(1, 2): "تاپل کلید",
3.14: "اعشاری"
}
# تکرار کلید
data = {"a": 1, "a": 2} # {'a': 2} - مقدار آخر
دسترسی امن
person = {"name": "علی", "age": 25}
# دسترسی معمولی
print(person["name"]) # علی
# print(person["email"]) # KeyError!
# get - امن، اگر نباشد None
email = person.get("email")
print(email) # None
# get با مقدار پیشفرض
phone = person.get("phone", "نامشخص")
print(phone) # نامشخص
# in - بررسی وجود کلید
if "email" in person:
print(person["email"])
else:
print("ایمیل ندارد")
# setdefault - اگر نبود اضافه میکند
person.setdefault("country", "ایران")
print(person)
متدهای دیکشنری
person = {"name": "علی", "age": 25, "city": "کاشان"}
# keys, values, items
print(person.keys()) # dict_keys(['name', 'age', 'city'])
print(person.values()) # dict_values(['علی', 25, 'کاشان'])
print(person.items()) # dict_items([('name','علی'), ('age',25), ('city','کاشان')])
# تبدیل به لیست
keys_list = list(person.keys())
# پیمایش
for key in person: # روی کلیدها
print(key, person[key])
for key, value in person.items(): # کلید و مقدار
print(f"{key}: {value}")
for value in person.values(): # فقط مقادیر
print(value)
# pop - حذف و بازگرداندن
age = person.pop("age")
print(age) # 25
print(person) # بدون age
# pop با پیشفرض (در صورت نبود کلید)
val = person.pop("nothing", "default")
# popitem - حذف و بازگشت آخرین جفت
key, val = person.popitem()
# update - ادغام دو دیکشنری
person = {"name": "علی"}
person.update({"age": 25, "city": "کاشان"})
print(person)
# {'name': 'علی', 'age': 25, 'city': 'کاشان'}
# روش جدید (Python 3.9+)
extra = {"job": "برنامهنویس"}
combined = person | extra # ادغام
person |= extra # ادغام جای خود
# clear
person.clear()
print(person) # {}
Dict Comprehension
# ساخت با حلقه
squares = {x: x**2 for x in range(5)}
print(squares)
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# با شرط
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares)
# تبدیل
prices = {"apple": 5000, "banana": 3000, "orange": 4500}
# ضرب همه قیمتها در ۱.۱ (۱۰٪ افزایش)
new_prices = {k: int(v * 1.1) for k, v in prices.items()}
# معکوس کردن کلید-مقدار
inverted = {v: k for k, v in prices.items()}
print(inverted)
# {5000: 'apple', 3000: 'banana', 4500: 'orange'}
# ساخت از دو لیست
keys = ["نام", "سن", "شهر"]
values = ["علی", 25, "کاشان"]
person = {k: v for k, v in zip(keys, values)}
print(person)
دیکشنری تو در تو
users = {
"ali": {
"age": 25,
"email": "ali@example.com",
"skills": ["Python", "Django"]
},
"zahra": {
"age": 30,
"email": "zahra@example.com",
"skills": ["JavaScript", "React"]
}
}
# دسترسی تو در تو
print(users["ali"]["email"])
print(users["ali"]["skills"][0])
# اضافه کردن مهارت جدید
users["ali"]["skills"].append("FastAPI")
# پیمایش کامل
for username, info in users.items():
print(f"n{username}:")
for key, value in info.items():
print(f" {key}: {value}")
مجموعه (Set)
set مجموعهای از مقادیر یکتا و بدون ترتیب:
# ساخت
fruits = {"سیب", "موز", "پرتقال"}
nums = {1, 2, 3, 4, 5}
# مقادیر تکراری حذف میشوند
duplicates = {1, 2, 2, 3, 3, 3}
print(duplicates) # {1, 2, 3}
# مهم: {} یعنی dict، نه set!
empty_dict = {}
empty_set = set() # ← برای ست خالی
# ساخت از لیست (حذف تکرار)
nums = [1, 2, 2, 3, 3, 4]
unique = set(nums)
print(unique) # {1, 2, 3, 4}
# تبدیل برگشتی به لیست
unique_list = list(set(nums))
متدهای ست
s = {1, 2, 3}
# اضافه کردن
s.add(4)
s.update([5, 6, 7])
print(s) # {1, 2, 3, 4, 5, 6, 7}
# حذف
s.remove(3) # KeyError اگر نباشد
s.discard(99) # بدون خطا اگر نباشد
val = s.pop() # یک عضو تصادفی
s.clear()
# عضویت
print(2 in {1, 2, 3}) # True
# طول
print(len({1, 2, 3})) # 3
عملیات مجموعهها
a = {1, 2, 3, 4, 5}
b = {4, 5, 6, 7, 8}
# اجتماع
print(a | b) # {1, 2, 3, 4, 5, 6, 7, 8}
print(a.union(b)) # همان
# اشتراک
print(a & b) # {4, 5}
print(a.intersection(b))
# تفاضل
print(a - b) # {1, 2, 3}
print(a.difference(b))
# تفاضل متقارن (در یکی هست، در آن یکی نه)
print(a ^ b) # {1, 2, 3, 6, 7, 8}
print(a.symmetric_difference(b))
# آیا a زیرمجموعه b است؟
print({1, 2}.issubset({1, 2, 3})) # True
print({1, 2, 3}.issuperset({1, 2})) # True
# مجزا
print({1, 2}.isdisjoint({3, 4})) # True (هیچ مشترکی ندارند)
Set Comprehension
# ساخت ست
squares = {x**2 for x in range(10)}
print(squares) # {0, 1, 64, 4, 36, 9, 16, 49, 81, 25}
# حذف تکرار از کلمات
text = "the quick brown fox jumps over the lazy dog"
unique_words = {word for word in text.split()}
print(len(unique_words))
مثالهای واقعی
شمارش با dict
text = "سیب موز پرتقال سیب موز سیب"
counts = {}
for word in text.split():
counts[word] = counts.get(word, 0) + 1
print(counts)
# {'سیب': 3, 'موز': 2, 'پرتقال': 1}
# روش حرفهای
from collections import Counter
counts = Counter(text.split())
print(counts.most_common(2)) # [('سیب', 3), ('موز', 2)]
گروهبندی
students = [
{"name": "علی", "grade": "A"},
{"name": "زهرا", "grade": "B"},
{"name": "محمد", "grade": "A"},
{"name": "سارا", "grade": "C"},
{"name": "حسن", "grade": "B"},
]
groups = {}
for s in students:
grade = s["grade"]
if grade not in groups:
groups[grade] = []
groups[grade].append(s["name"])
print(groups)
# {'A': ['علی', 'محمد'], 'B': ['زهرا', 'حسن'], 'C': ['سارا']}
پیدا کردن عناصر مشترک و متفاوت
old_users = {"ali", "zahra", "mohammad"}
new_users = {"zahra", "sara", "hasan"}
# هنوز هستند
common = old_users & new_users # {'zahra'}
# جدید اضافه شدند
new = new_users - old_users # {'sara', 'hasan'}
# رفتند
left = old_users - new_users # {'ali', 'mohammad'}
print(f"موجود: {common}")
print(f"جدید: {new}")
print(f"رفتند: {left}")
تمرین فصل
🏋️ تمرین ۱: دیکشنری از محصولات با قیمت بسازید و گرانترین، ارزانترین و میانگین قیمت را چاپ کنید.
🏋️ تمرین ۲: رشتهای بگیرید و دیکشنری از تعداد تکرار هر حرف بسازید.
🏋️ تمرین ۳: دو لیست از علاقهمندیهای دو نفر بگیرید و علاقهمندیهای مشترک، فقط نفر اول و فقط نفر دوم را چاپ کنید (با set).
🏋️ تمرین ۴: دفترچه تلفن ساده با dict بسازید: اضافه کردن، حذف، جستجو، نمایش همه مخاطبین.
جمعبندی
- دیکشنری: کلید-مقدار با
{}، تغییرپذیر، کلیدها یکتا - متدها:
get،keys،values،items،update،pop - Dict Comprehension
- ست: مقادیر یکتا و بدون ترتیب
- عملیات مجموعه: اجتماع، اشتراک، تفاضل
Counterازcollectionsبرای شمارش