Python ดิกชันนารี (Dictionary)



ลิสต์เก็บของเรียงตามลำดับ เข้าถึงด้วยเลขตำแหน่ง แต่บางทีเราอยากเข้าถึงข้อมูลด้วย “ชื่อ” มากกว่า เช่น อยากได้ราคาของ “กาแฟ” ไม่ใช่ราคาของ “รายการที่ 3” ดิกชันนารีเก็บข้อมูลเป็นคู่ คีย์ (key) กับ ค่า (value) ให้เราค้นด้วยคีย์ได้ทันที

สร้างดิกชันนารี

ใช้ปีกกา {} แต่ละคู่เขียนเป็น คีย์: ค่า คั่นด้วยจุลภาค

student = {
    "name": "สมชาย",
    "age": 20,
    "gpa": 3.45,
}

prices = {"กาแฟ": 45, "ชา": 40, "ขนมปัง": 25}
empty = {}

คีย์มักเป็น string หรือตัวเลข ส่วนค่าเป็นอะไรก็ได้ รวมถึงลิสต์หรือ dict ซ้อนเข้าไปอีก

เข้าถึงค่า

ใส่คีย์ในวงเล็บเหลี่ยม

student = {"name": "สมชาย", "age": 20}

print(student["name"])   # สมชาย
print(student["age"])    # 20

ถ้าคีย์ไม่มีอยู่ จะ error

print(student["email"])   # KeyError: 'email'

get() ปลอดภัยกว่า

get() คืน None ถ้าไม่เจอคีย์ แทนที่จะ error และกำหนดค่า default ได้ด้วย

print(student.get("email"))            # None
print(student.get("email", "ไม่ระบุ"))   # ไม่ระบุ
print(student.get("name", "ไม่ระบุ"))    # สมชาย

ใช้ get() เมื่อไม่แน่ใจว่าคีย์จะมีไหม ใช้ [] เมื่อมั่นใจว่าต้องมี (ถ้าไม่มีแล้วอยากให้ error จะได้รู้ว่าโค้ดผิด)

เพิ่มและแก้ไข

ทั้งสองอย่างเขียนเหมือนกัน ถ้าคีย์มีอยู่แล้วคือแก้ ถ้ายังไม่มีคือเพิ่ม

student = {"name": "สมชาย", "age": 20}

student["age"] = 21              # แก้
student["email"] = "s@mail.com"  # เพิ่ม

print(student)
# {'name': 'สมชาย', 'age': 21, 'email': 's@mail.com'}

ลบ

student = {"name": "สมชาย", "age": 20, "email": "s@mail.com"}

del student["email"]
age = student.pop("age")   # ลบพร้อมคืนค่า
print(age)                 # 20
print(student)             # {'name': 'สมชาย'}

เช็คว่ามีคีย์ไหม

prices = {"กาแฟ": 45, "ชา": 40}

print("กาแฟ" in prices)   # True
print("นม" in prices)     # False

if "นม" not in prices:
    prices["นม"] = 20

วนลูปในดิกชันนารี

prices = {"กาแฟ": 45, "ชา": 40, "ขนมปัง": 25}

# วนเอาคีย์ (ค่าเริ่มต้น)
for item in prices:
    print(item)

# วนเอาทั้งคีย์และค่า — ใช้บ่อยสุด
for item, price in prices.items():
    print(f"{item} ราคา {price} บาท")

# วนเอาเฉพาะค่า
for price in prices.values():
    print(price)

ผลลัพธ์ของ items():

กาแฟ ราคา 45 บาท
ชา ราคา 40 บาท
ขนมปัง ราคา 25 บาท

เมท็อดที่ควรรู้

prices = {"กาแฟ": 45, "ชา": 40, "ขนมปัง": 25}

print(list(prices.keys()))     # ['กาแฟ', 'ชา', 'ขนมปัง']
print(list(prices.values()))   # [45, 40, 25]
print(len(prices))             # 3
print(sum(prices.values()))    # 110

นับจำนวนด้วยดิกชันนารี

รูปแบบที่เจอบ่อยมาก: นับว่าอะไรปรากฏกี่ครั้ง

text = "กขกคกขงกค"
count = {}

for ch in text:
    count[ch] = count.get(ch, 0) + 1

print(count)   # {'ก': 4, 'ข': 2, 'ค': 2, 'ง': 1}

count.get(ch, 0) + 1 อ่านว่า “เอาจำนวนเดิมของ ch (ถ้ายังไม่มีให้เป็น 0) แล้วบวก 1”

ดิกชันนารีซ้อน

ค่าของ dict เป็น dict อีกชั้นได้ เหมาะกับข้อมูลที่มีโครงสร้าง

students = {
    "s001": {"name": "สมชาย", "gpa": 3.4},
    "s002": {"name": "สมหญิง", "gpa": 3.8},
}

print(students["s002"]["name"])   # สมหญิง

for sid, info in students.items():
    print(f"{sid}: {info['name']} (GPA {info['gpa']})")

ตัวอย่างรวม: ระบบสั่งอาหารอย่างง่าย

menu = {"ข้าวผัด": 50, "ผัดไทย": 60, "ต้มยำ": 80}
order = {}

print("=== เมนู ===")
for name, price in menu.items():
    print(f"{name} - {price} บาท")

print("\nสั่งอาหาร (พิมพ์ done เพื่อจบ)")
while True:
    choice = input("เมนู: ")
    if choice == "done":
        break
    if choice in menu:
        order[choice] = order.get(choice, 0) + 1
    else:
        print("ไม่มีเมนูนี้")

print("\n=== สรุปรายการ ===")
total = 0
for name, qty in order.items():
    subtotal = menu[name] * qty
    total += subtotal
    print(f"{name} x{qty} = {subtotal} บาท")
print(f"รวมทั้งสิ้น {total} บาท")

ผลลัพธ์:

สั่งอาหาร (พิมพ์ done เพื่อจบ)
เมนู: ข้าวผัด
เมนู: ข้าวผัด
เมนู: ต้มยำ
เมนู: done

=== สรุปรายการ ===
ข้าวผัด x2 = 100 บาท
ต้มยำ x1 = 80 บาท
รวมทั้งสิ้น 180 บาท

เช็คความเข้าใจก่อนข้ามบท

  • สร้าง dict และเข้าถึงค่าด้วย key ได้
  • เลือกใช้ .get() เมื่อไม่แน่ใจว่ามี key นั้นหรือไม่
  • ลองนับจำนวนคำในประโยคหนึ่งประโยคด้วย dict

สรุป

  • ดิกชันนารีเก็บข้อมูลเป็นคู่ คีย์: ค่า ค้นด้วยคีย์ได้ทันที
  • [] เข้าถึงแบบต้องมีคีย์, get() เข้าถึงแบบปลอดภัยมี default
  • กำหนดค่าให้คีย์ใหม่ = เพิ่ม, คีย์เดิม = แก้
  • .items() วนเอาคู่คีย์–ค่า เป็นรูปแบบที่ใช้บ่อยสุด
  • dict.get(key, 0) + 1 เป็นสำนวนมาตรฐานสำหรับนับจำนวน

บทถัดไปเป็น Comprehension วิธีสร้างลิสต์และดิกชันนารีแบบสั้นในบรรทัดเดียว