چالش روزانه · ۲۲ مهر ۱۴۰۵
چالش پایتون ۸: دیکشنری و چهار کلید
قبل از اجرای کد، خروجی آن را پیشبینی کن. حدس نزن؛ خط به خط فکر کن پایتون چه میکند.
d = {}
d[(1, 2)] = "a" # 1
d["x"] = [1, 2] # 2
d[3.5] = "b" # 3
d[[1, 2]] = "c" # 4نمایش پاسخ و توضیح
پاسخ درست: گزینهٔ د — 4
گام به گام
کلید دیکشنری باید تغییرناپذیر (دقیقتر: hashable) باشد. پایتون جای هر کلید را از روی «اثر انگشتِ» آن (hash) حساب میکند. اگر کلید بعداً عوض شود، دیگر پیدا نمیشود.
- خط ۱: تاپلِ عددها تغییرناپذیر است، پس کلید مجاز است.
- خط ۲: کلید رشته است و مجاز. مقدار لیست است، ولی برای مقدار هیچ محدودیتی نیست.
- خط ۳: عدد اعشاری هم تغییرناپذیر است، پس کلید مجاز است.
- خط ۴: لیست تغییرپذیر است و نمیتواند کلید باشد.
TypeError: cannot use 'list' as a dict key (unhashable type: 'list')
جواب: خط 4
خودتان ببینید
d = {}
d[(1, 2)] = "a"
d["x"] = [1, 2]
d[3.5] = "b"
print(d)
try:
d[[1, 2]] = "c"
except TypeError as e:
print("خطا:", e)
نکتهٔ کاربردی: اگر چند مقدار را با هم کلید لازم دارید (مثل مختصات یا جفت شهرها)، آنها را تاپل کنید، نه لیست: dist[("tehran", "shiraz")] = 935. (درس دیکشنری: چه چیزی میتواند کلید باشد؟)
حالا خودت اجرا کن و تغییرش بده
d = {}
d[(1, 2)] = "a" # 1
d["x"] = [1, 2] # 2
d[3.5] = "b" # 3
d[[1, 2]] = "c" # 4