چالش روزانه · ۲۲ مهر ۱۴۰۵

چالش پایتون ۸: دیکشنری و چهار کلید

قبل از اجرای کد، خروجی آن را پیش‌بینی کن. حدس نزن؛ خط به خط فکر کن پایتون چه می‌کند.

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