2.9. Từ điển (Dictionary)

Một từ điển là ánh xạ từ khóa sang giá trị. Mỗi khóa được tra cứu trực tiếp; từ điển ghi nhớ giá trị cuối cùng được liên kết với khóa đó.

2.9.1. Tạo từ điển

Sử dụng dấu ngoặc nhọn với các cặp key: value, hoặc hàm tạo 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

Giá trị có thể là bất kỳ kiểu nào -- chuỗi, số, danh sách, thậm chí là các dict khác:

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.

Mỗi khóa trong từ điển ánh xạ đến đúng một giá trị.

2.9.2. Truy cập và kiểm tra thành phần

Lập chỉ mục bằng [] lấy ra giá trị cho một khóa. Một khóa không tồn tại sẽ gây ra KeyError:

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

Để tra cứu an toàn hơn, sử dụng dict.get(). Nó trả về None nếu khóa không tồn tại, hoặc giá trị bạn truyền vào làm đối số thứ hai:

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

Từ khóa in kiểm tra sự tồn tại của khóa -- không phải giá trị:

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

2.9.3. Thêm, cập nhật, và xóa

Gán giá trị cho d[key] sẽ thêm mục mới nếu khóa chưa tồn tại, hoặc ghi đè nếu khóa đã tồn tại:

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

Có một vài cách để xóa:

  • del d[key] -- xóa một mục; gây ra KeyError nếu khóa không tồn tại.

  • dict.pop() -- xóa và trả về giá trị; một giá trị mặc định tùy chọn cho phép bạn tránh ngoại lệ.

  • dict.clear() -- xóa tất cả các mục.

dict.update() hợp nhất một từ điển khác (hoặc danh sách các cặp (key, value)) vào từ điển hiện tại, ghi đè bất kỳ khóa nào trùng khớp:

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

2.9.4. Lặp qua từ điển

Lặp qua một từ điển trực tiếp sẽ trả ra các khóa của nó, theo thứ tự chèn vào:

for k in person:
    print(k)

Ba dạng view cho phép truy cập rõ ràng:

  • dict.keys() -- các khóa (giống như lặp qua dict).

  • dict.values() -- các giá trị.

  • dict.items() -- các tuple (key, value), rất tiện để giải nén trong vòng lặp.

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

2.9.5. Những gì có thể là khóa

Khóa của từ điển phải có khả năng băm (hash) -- giá trị của chúng không thể thay đổi trong suốt vòng đời. Các kiểu có thể băm phổ biến là:

Các kiểu có thể thay đổi như list, dict, và bytearray không thể làm khóa; sử dụng chúng sẽ gây ra TypeError. Tuple của các giá trị bất biến là cách chuẩn để sử dụng một định danh phức hợp làm khóa từ điển, chẳng hạn tọa độ lưới 2 chiều:

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

2.9.6. Độ dài

len() trả về số lượng mục:

>>> len(person)
4