ดิกชันนารีใน Python: คู่มือฉบับสมบูรณ์พร้อมตัวอย่างจริง
บทเรียนนี้แปลจากต้นฉบับภาษาอังกฤษRead in EnglishLeer en españolЧитать на русскомLer em portuguêsแจ้งข้อผิดพลาดในการแปล
เปิดแอปรายชื่อผู้ติดต่อในโทรศัพท์ของคุณ คุณค้นหาคนจาก ชื่อ แล้วได้ เบอร์โทรศัพท์ ของเขา คุณไม่ได้ค้นจากตำแหน่ง ไม่ได้บอกว่า "ขอรายชื่อลำดับที่ 47" คุณค้นจากชื่อ
ดิกชันนารี (dictionary) ใน Python ทำงานแบบเดียวกันเลย แทนที่จะเก็บข้อมูลตามตำแหน่ง (แบบลิสต์) ดิกชันนารีเก็บข้อมูลเป็น คู่คีย์-ค่า (key-value pair) คีย์คือชื่อที่คุณใช้ค้นหา และค่าคือสิ่งที่คุณได้กลับมา
ดิกชันนารีมีอยู่ทุกที่ในการเขียนโปรแกรมจริง ข้อมูลโปรไฟล์ผู้ใช้ การตั้งค่าโปรแกรม ข้อมูล JSON จาก API ตัวนับคำ ล้วนใช้ดิกชันนารีทั้งนั้น ในบทเรียนนี้ คุณจะได้ฝึกการใช้งานดิกชันนารีที่จำเป็นทุกอย่างจนคล่อง
วิธีสร้างดิกชันนารีใน Python
คุณสร้างดิกชันนารีด้วย วงเล็บปีกกา {} โดยใส่คู่คีย์-ค่าที่คั่นคีย์กับค่าด้วยโคลอน และคั่นแต่ละคู่ด้วยเครื่องหมายจุลภาค
{'name': 'Alice', 'phone': '555-1234', 'email': 'alice@example.com'}คีย์มักเป็นสตริง แต่จะเป็นค่าใดก็ได้ที่ แฮชได้ (hashable) ซึ่งในทางปฏิบัติคือค่าที่เปลี่ยนแปลงไม่ได้ เช่น ตัวเลข ค่าความจริง หรือทูเพิลของค่าเหล่านี้ ส่วนค่าเป็น อะไรก็ได้ ทั้งสตริง ตัวเลข ลิสต์ หรือแม้แต่ดิกชันนารีอื่น
{'name': 'Bob', 'age': 16, 'grades': [85, 92, 78], 'active': True}
{}
{}การเข้าถึงและแก้ไขค่าในดิกชันนารี
ถ้าต้องการดึงค่าจากดิกชันนารี ให้ใส่คีย์ไว้ในวงเล็บเหลี่ยม ถ้าต้องการเปลี่ยนค่า ให้กำหนดค่าใหม่ให้คีย์นั้น ถ้าต้องการเพิ่มคู่ใหม่ ก็แค่กำหนดค่าให้คีย์ที่ยังไม่มีอยู่
Alice
25
26
{'name': 'Alice', 'age': 26, 'city': 'Boston', 'job': 'Engineer'}Not specified Alice
data = {'x': 10}
# Crashes with KeyError:
value = data['y']data = {'x': 10}
# Returns 0 if 'y' is missing:
value = data.get('y', 0)เมธอดที่จำเป็นของดิกชันนารี
ดิกชันนารีมีเมธอดในตัวหลายตัวที่ช่วยให้ทำงานได้ง่าย นี่คือเมธอดที่คุณจะใช้บ่อยที่สุด
['apple', 'banana', 'cherry']
[1.5, 0.75, 3.0]
[('apple', 1.5), ('banana', 0.75), ('cherry', 3.0)]3
{'apples': 5, 'oranges': 8}
{'apples': 10, 'oranges': 8, 'grapes': 12}สังเกตว่า update() ทั้งเพิ่มคีย์ใหม่และเขียนทับคีย์ที่มีอยู่แล้ว ในตัวอย่างด้านบน 'apples' เปลี่ยนจาก 5 เป็น 10 และ 'grapes' ถูกเพิ่มเข้ามาเป็นคีย์ใหม่
วนลูปผ่านดิกชันนารี
คุณวนลูปผ่านคีย์ ค่า หรือทั้งสองอย่างของดิกชันนารีได้ วิธีที่ใช้บ่อยที่สุดคือวนลูปผ่าน items() เพื่อให้ได้ทั้งคีย์และค่าในคราวเดียว
Alice Bob Charlie --- 95 87 72 --- Alice: 95 Bob: 87 Charlie: 72
ตรวจว่ามีคีย์อยู่หรือไม่
ก่อนเข้าถึงคีย์ บ่อยครั้งคุณอยากตรวจก่อนว่ามีคีย์นั้นอยู่ คีย์เวิร์ด in ตรวจหาคีย์ ไม่ใช่ค่า
True False True Email: alice@example.com
ดิกชันนารีซ้อนกัน
ค่าในดิกชันนารีเป็นดิกชันนารีอีกตัวได้ เรียกว่า การซ้อน (nesting) ซึ่งช่วยให้แทนข้อมูลที่ซับซ้อนและมีโครงสร้างได้ เช่น ห้องเรียนที่มีนักเรียนหลายคน แต่ละคนมีชุดข้อมูลของตัวเอง
A 15 Alice is 16 and got a A Bob is 15 and got a B Charlie is 16 and got a A
ถ้าต้องการเข้าถึงค่าที่ซ้อนอยู่ ให้ใช้วงเล็บเหลี่ยมต่อกัน: คีย์ด้านนอกก่อน แล้วตามด้วยคีย์ด้านใน คุณซ้อนลึกเท่าไรก็ได้ แต่ถ้าเกินสองหรือสามชั้นจะเริ่มอ่านยาก
ข้อผิดพลาดที่พบบ่อยกับดิกชันนารี
New York
data = {'a': 1, 'b': 2, 'c': 3}
for key in data:
if data[key] < 2:
del data[key] # RuntimeError!data = {'a': 1, 'b': 2, 'c': 3}
for key in list(data.keys()):
if data[key] < 2:
del data[key] # Safe!
print(data) # {'b': 2, 'c': 3}แบบฝึกหัด
ถึงเวลาฝึกแล้ว แบบฝึกหัดเหล่านี้ไล่ระดับจากการใช้งานดิกชันนารีขั้นพื้นฐาน ไปจนถึงรูปแบบที่ซับซ้อนขึ้น
สร้างดิกชันนารีชื่อ pet ที่มีคู่คีย์-ค่าดังนี้:
'name': 'Buddy''species': 'dog''age': 5จากนั้นแสดงชื่อของสัตว์เลี้ยง
ผลลัพธ์ที่ควรได้:
Buddyมีดิกชันนารีที่เก็บข้อมูลหนังสือให้มา ทำตามขั้นตอนต่อไปนี้ตามลำดับ:
1. เปลี่ยน 'year' เป็น 2024
2. เพิ่มคีย์ใหม่ 'genre' ที่มีค่า 'fiction'
3. แสดงดิกชันนารีทั้งหมด
ผลลัพธ์ที่ควรได้:
{'title': 'The Great Adventure', 'author': 'Jane Smith', 'year': 2024, 'genre': 'fiction'}มีดิกชันนารีโปรไฟล์ผู้ใช้ให้มา ใช้เมธอด .get() เพื่อแสดงเบอร์โทรศัพท์ของผู้ใช้อย่างปลอดภัย ถ้าไม่มีคีย์ 'phone' ให้แสดง 'No phone number'
ผลลัพธ์ที่ควรได้:
No phone numberวนลูปผ่านดิกชันนารี แล้วแสดงผลไม้แต่ละชนิดพร้อมราคาในรูปแบบนี้:
apple: $1.50
banana: $0.75
cherry: $3.00ราคาต้องแสดงทศนิยมสองตำแหน่งพอดี
อ่านโค้ดนี้อย่างละเอียดแล้วทายว่าจะแสดงอะไร จะเกิดอะไรขึ้นเมื่อดิกชันนารีมีคีย์ซ้ำกัน
พิมพ์ผลลัพธ์ให้ตรงทุกตัวอักษร
โค้ดนี้พยายามตรวจว่ามีเกรด 'A' อยู่ในดิกชันนารีหรือไม่ แต่ตรวจผิดที่ แก้ให้แสดงผล:
Someone got an A!นับว่าแต่ละคำปรากฏกี่ครั้งในลิสต์ที่ให้มา เก็บจำนวนไว้ในดิกชันนารีชื่อ word_counts แล้วแสดงผล
ผลลัพธ์ที่ควรได้:
{'hello': 3, 'world': 2, 'python': 1}มีดิกชันนารีซ้อนกันของนักเรียนให้มา วนลูปผ่านนักเรียนแต่ละคน แล้วแสดงชื่อและคะแนนคณิตศาสตร์ในรูปแบบนี้:
Alice: 95
Bob: 82
Charlie: 91สรุป: สิ่งที่คุณได้เรียนเกี่ยวกับดิกชันนารีใน Python
เยี่ยมมาก นี่คือสรุปทุกสิ่งที่คุณรู้แล้ว:
| แนวคิด | ทำอะไร | ตัวอย่าง |
|---|---|---|
| สร้าง dict | เก็บคู่คีย์-ค่า | d = {'name': 'Alice'} |
| เข้าถึงด้วยคีย์ | ดึงค่า | d['name'] |
| เข้าถึงอย่างปลอดภัย | ได้ค่าเริ่มต้นถ้าไม่มีคีย์ | d.get('x', 0) |
| เพิ่ม / แก้ไข | กำหนดค่า | d['age'] = 25 |
keys() | คีย์ทั้งหมด | d.keys() |
values() | ค่าทั้งหมด | d.values() |
items() | ทูเพิลคีย์-ค่า | d.items() |
pop(key) | ลบและคืนค่า | d.pop('age') |
update() | รวม dict | d.update(other) |
in | ตรวจว่ามีคีย์อยู่หรือไม่ | 'name' in d |
| การซ้อน | dict ภายใน dict | d['a']['b'] |
ดิกชันนารีเป็นหนึ่งในโครงสร้างข้อมูลที่สำคัญที่สุดใน Python ข้อมูล JSON ผลตอบกลับจาก API ไฟล์ตั้งค่า ตัวนับ ทั้งหมดล้วนอาศัยคู่คีย์-ค่า
เรียนอะไรต่อ
ในบทเรียนถัดไป Comprehension ใน Python คุณจะได้เรียนวิธีสร้างลิสต์ ดิกชันนารี และเซต ด้วยโค้ดบรรทัดเดียวที่สวยงาม
comprehension ช่วยให้คุณแทนที่ลูปหลายบรรทัดด้วยโค้ดบรรทัดเดียวที่กระชับ และเป็นหนึ่งในความสามารถที่ทำให้ Python ดูสะอาดและสื่อความหมายได้ดี