~/icsd.ir — bash
SYSTEM_ONLINE

دیکشنری و مجموعه

دیکشنری و مجموعه دو ساختار داده فوق‌العاده مفید هستند. دیکشنری برای ذخیره داده‌های کلید-مقدار و مجموعه برای ذخیره مقادیر یکتا.

دیکشنری و مجموعه دو ساختار داده فوق‌العاده مفید هستند. دیکشنری برای ذخیره داده‌های کلید-مقدار و مجموعه برای ذخیره مقادیر یکتا.

دیکشنری (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 برای شمارش

نمایش سایت

رنگ سایت
حالت نمایش
اندازهٔ متن
خوانایی

این تنظیمات فقط روی مرورگر شما ذخیره می‌شود.