نگاشت کلید به مقدار
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)بنویسید.