2.9. พจนานุกรม

พจนานุกรม คือการแมปจาก คีย์ ไปยัง ค่า แต่ละคีย์จะถูกค้นหาโดยตรง และพจนานุกรมจะจดจำค่าที่เชื่อมโยงกับคีย์นั้นไว้ล่าสุด

2.9.1. การสร้างพจนานุกรม

ใช้วงเล็บปีกกาพร้อมคู่ key: value หรือตัวสร้าง dict:

empty   = {}
person  = {"name": "OpenMV", "id": 42}
counts  = dict(a=1, b=2, c=3)            # keyword form
pairs   = dict([("x", 1), ("y", 2)])     # from a list of pairs

ค่าสามารถเป็นประเภทใดก็ได้ ทั้งสตริง ตัวเลข รายการ หรือแม้แต่ dict อื่น:

config = {
    "name":  "OpenMV",
    "id":    42,
    "width": 320,
    "tags":  ["red", "round"],
}
A dictionary shown as two columns: keys on the left, values on the right, with arrows linking each pair.

แต่ละคีย์ในพจนานุกรมแมปไปยังค่าหนึ่งค่าเท่านั้น

2.9.2. การเข้าถึงและการตรวจสอบสมาชิก

การจัดทำดัชนีด้วย [] จะดึงค่าสำหรับคีย์นั้น หากคีย์ไม่มีอยู่จะเกิด KeyError:

>>> person = {"name": "OpenMV", "id": 42}
>>> person["name"]
'OpenMV'
>>> person["missing"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'missing'

สำหรับการค้นหาแบบผ่อนปรน ใช้ dict.get() ซึ่งจะคืนค่า None สำหรับคีย์ที่ไม่มีอยู่ หรือค่าที่คุณส่งเป็นอาร์กิวเมนต์ที่สอง:

>>> person.get("name")
'OpenMV'
>>> person.get("missing")            # returns None
>>> person.get("missing", "n/a")
'n/a'

คีย์เวิร์ด in ทดสอบการเป็นสมาชิกของ คีย์ ไม่ใช่ค่า:

>>> "name" in person
True
>>> "OpenMV" in person
False

2.9.3. การเพิ่ม อัปเดต และลบ

การกำหนดค่าให้ d[key] จะเพิ่มรายการหากคีย์ใหม่ และเขียนทับหากมีอยู่แล้ว:

>>> person["seen"] = 1
>>> person["seen"] = 2               # overwrites
>>> person
{'name': 'OpenMV', 'id': 42, 'seen': 2}

การลบมีหลายรูปแบบ:

  • del d[key] -- ลบรายการออก หากคีย์ไม่มีอยู่จะเกิด KeyError

  • dict.pop() -- ลบและคืนค่า โดยมีค่าเริ่มต้นที่เป็นทางเลือกเพื่อหลีกเลี่ยงข้อยกเว้น

  • dict.clear() -- ลบทุกรายการออก

dict.update() รวมพจนานุกรมอื่น (หรือรายการคู่ (key, value)) เข้าไปในตัวรับ โดยเขียนทับคีย์ที่ตรงกัน:

>>> person.update({"id": 100, "owner": "alice"})
>>> person
{'name': 'OpenMV', 'id': 100, 'seen': 2, 'owner': 'alice'}

2.9.4. การวนซ้ำ

การวนซ้ำพจนานุกรมโดยตรงจะให้คีย์ของมัน ตามลำดับการแทรก:

for k in person:
    print(k)

มุมมองสามแบบให้การเข้าถึงอย่างชัดเจน:

  • dict.keys() -- คีย์ทั้งหมด (เหมือนกับการวนซ้ำ dict)

  • dict.values() -- ค่าทั้งหมด

  • dict.items() -- ทูเพิล (key, value) เหมาะอย่างยิ่งสำหรับการแกะแพ็กในลูป

for key, value in person.items():
    print(key, "=", value)

2.9.5. อะไรสามารถเป็นคีย์ได้

คีย์พจนานุกรมต้องสามารถ แฮช ได้ นั่นคือค่าของมันไม่สามารถเปลี่ยนแปลงได้ตลอดอายุการใช้งาน ประเภทที่แฮชได้ทั่วไปได้แก่:

  • int, float, bool

  • str, bytes

  • tuple (เมื่อทุกองค์ประกอบภายในสามารถแฮชได้ด้วย)

  • None

ประเภทที่เปลี่ยนแปลงได้ เช่น list, dict และ bytearray ไม่สามารถเป็นคีย์ได้ การใช้ประเภทเหล่านี้จะเกิด TypeError ทูเพิลของค่าที่ไม่เปลี่ยนแปลงเป็นวิธีมาตรฐานในการใช้ตัวระบุผสม เช่น พิกัดตาราง 2 มิติ:

>>> grid = {}
>>> grid[(0, 0)] = "start"
>>> grid[(5, 7)] = "end"

2.9.6. ความยาว

len() คืนค่าจำนวนรายการ:

>>> len(person)
4