فصل ۴: ساختارهای داده — list، tuple، dict، set و collections

dict: get، setdefault، items و مرتب‌سازی بر اساس مقدار

نگاشت کلید به مقدار

dict مهم‌ترین ساختار داده‌ی پایتون است؛ حتی خود زبان در درون از آن برای متغیرها و ویژگی‌های اشیا استفاده می‌کند. هر عضو یک جفت کلید: مقدار است و جست‌وجو با کلید تقریباً فوری انجام می‌شود، مهم نیست دیکشنری ده عضو داشته باشد یا ده میلیون. کلید باید تغییرناپذیر (hashable) باشد: رشته، عدد، tuple.

order = {
    "code": "KSH-101",
    "customer": "مریم کاشانی",
    "size": (200, 300),
    "price": 185_000_000,
}
print(order["customer"])
order["status"] = "weaving"      # افزودن یا تغییر
del order["size"]                # حذف
print("price" in order)          # بررسی وجود کلید (نه مقدار)

از Python 3.7 به بعد، دیکشنری ترتیب درج را حفظ می‌کند؛ این بخشی از مشخصات رسمی زبان است، نه جزئیات پیاده‌سازی.

خواندن امن: get

دسترسی با d[key] اگر کلید نباشد KeyError می‌دهد. وقتی نبودن کلید طبیعی است، از get استفاده کنید:

stock = {"کاشان": 12, "تبریز": 7}
print(stock.get("مشهد"))         # None
print(stock.get("مشهد", 0))      # 0

for city in ["کاشان", "مشهد", "کاشان"]:
    stock[city] = stock.get(city, 0) + 1

setdefault: گروه‌بندی

by_city = {}
for city, code in [("کاشان", "K1"), ("تبریز", "T1"), ("کاشان", "K2")]:
    by_city.setdefault(city, []).append(code)
print(by_city)     # {'کاشان': ['K1', 'K2'], 'تبریز': ['T1']}

setdefault اگر کلید نباشد، آن را با مقدار پیش‌فرض می‌سازد و در هر حال مقدار فعلی را برمی‌گرداند. (در درس collections راه تمیزتر defaultdict را می‌بینید.)

پیمایش و مرتب‌سازی

sales = {"کاشان": 42, "تبریز": 17, "مشهد": 29}

for city, count in sales.items():          # جفت کلید و مقدار
    print(f"{city:<8}{count:>5}")

top = sorted(sales.items(), key=lambda kv: kv[1], reverse=True)
print(top)                                 # [('کاشان', 42), ('مشهد', 29), ('تبریز', 17)]
print(max(sales, key=sales.get))           # کاشان

merged = sales | {"اصفهان": 11}            # ادغام (3.9+)
sales |= {"تبریز": 20}                     # به‌روزرسانی درجا
متدخروجی
keys()نمای کلیدها
values()نمای مقادیر
items()نمای جفت‌ها
pop(k, default)حذف و برگرداندن مقدار
update(other)ادغام درجا

نکته‌هایی که کمتر کسی می‌داند

  • افزودن یا حذف کلید حین پیمایش دیکشنری خطای RuntimeError: dictionary changed size during iteration می‌دهد؛ روی list(d) پیمایش کنید.
  • 1، 1.0 و True به‌عنوان کلید یکی حساب می‌شوند! {1: "a", True: "b"} فقط یک عضو دارد: {1: 'b'}.
  • keys() و items() «نما» (view) هستند و زنده‌اند؛ روی keys می‌توانید عملیات مجموعه بزنید: d1.keys() & d2.keys() کلیدهای مشترک را می‌دهد.
  • dict(zip(names, prices)) دو لیست را در یک خط به دیکشنری تبدیل می‌کند؛ {v: k for k, v in d.items()} کلید و مقدار را جابه‌جا می‌کند.
  • d.get(k) or default برای مقادیر صفر یا رشته‌ی خالی اشتباه است؛ همیشه d.get(k, default) بنویسید.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.