Menu

Dictionary trong Python: tạo, truy cập, cập nhật và duyệt dict

Từ điển là cấu trúc tra cứu khóa và giá trị của Python, kiểu dữ liệu bạn sẽ dùng liên tục khi đã qua phần cơ bản.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Dictionary là một bảng tra cứu

List được đánh chỉ số theo vị trí. Dictionary (từ điển) được đánh chỉ số theo khóa, thường là chuỗi hoặc số, và mỗi khóa ánh xạ tới một giá trị. Chỉ một thay đổi đó đã mở ra cả một nhóm chương trình lớn: kho hàng, cấu hình, dữ liệu JSON, hồ sơ người dùng, cache.

Khóa và giá trị có thể là gần như bất cứ thứ gì. Khóa phải hashable (tức là số, chuỗi, tuple; không phải list hay dict khác). Giá trị thì không có giới hạn: một dict có thể chứa mọi thứ, kể cả dict hoặc list khác.

Tạo dictionary

Có nhiều cách, mỗi cách có chỗ dùng riêng:

Đọc giá trị

Có hai cách, và lựa chọn này quan trọng:

Chọn theo ý định:

  • Dùng [] khi khóa bắt buộc phải có. Nếu không có, đó là bug và bạn muốn lỗi hiện ra rõ ràng.
  • Dùng .get() khi "không có" là một trường hợp hợp lệ. Nó cho phép bạn viết giá trị mặc định mà không cần try/except.

Thêm, cập nhật, xóa

Gán giá trị cho một khóa sẽ tạo mới hoặc cập nhật khóa đó:

update() gộp vào một dict khác hoặc một iterable gồm các cặp:

Những khóa trùng trong overrides sẽ ghi đè lên khóa trong settings.

Kiểm tra một khóa

in kiểm tra các khóa, không phải các giá trị:

Để kiểm tra riêng các giá trị, hãy dùng user.values():

Cách duyệt một dictionary

Bạn có ba "góc nhìn" để lặp qua:

.items() là thứ bạn dùng nhiều nhất: nó cho bạn từng cặp, đã được tách sẵn, dùng được ngay.

Thứ tự duyệt trong Python hiện đại (3.7 trở lên) khớp với thứ tự thêm vào. Một dict không phải là "túi thần kỳ": nếu bạn thêm a rồi b rồi c, việc duyệt sẽ trả về đúng thứ tự đó. Đây là điều ngôn ngữ đảm bảo, bạn có thể dựa vào.

Cách sắp xếp một dictionary

Dict giữ thứ tự thêm vào, nên "sắp xếp" một dict thật ra là tạo một dict mới với các khóa được thêm vào theo thứ tự bạn muốn:

sorted() trả về một list các cặp; bọc nó trong dict(...) sẽ dựng lại một dictionary theo thứ tự mới. Nếu bạn chỉ cần các cặp đã sắp xếp (không cần dict), hãy bỏ lời gọi dict() bên ngoài.

Cách gộp hai dictionary

Python 3.9 trở lên có toán tử |:

Khi trùng khóa, giá trị từ dict bên phải sẽ thắng. .update() là phiên bản tương đương, sửa trực tiếp dict gốc. Với các phiên bản Python cũ hơn, hãy dùng {**defaults, **overrides}.

Mẫu setdefault

Một nhu cầu hay gặp: "nếu khóa đã có thì dùng giá trị của nó; nếu chưa thì đặt giá trị mặc định rồi dùng".

Hoặc tốt hơn, hãy dùng collections.Counter:

Counter là một lớp con của dict, mặc định làm việc đếm. Đó là lựa chọn đúng bất cứ khi nào bạn cần đếm số lần xuất hiện.

Dict comprehension

Tương tự list comprehension, nhưng để tạo dict:

Quy tắc giống list comprehension, chỉ khác là có key: value bên trong cặp ngoặc nhọn.

Dict, người anh em song sinh của JSON

Dict trong Python gần như khớp hoàn toàn với đối tượng JSON. Chuyển đổi qua lại chỉ cần một lời gọi:

Đó là lý do dict xuất hiện khắp nơi trong lập trình web: các request và response API của bạn về cơ bản là thao tác với dict, chỉ có thêm mạng ở giữa.

Một ví dụ thực tế

Một chương trình nhỏ kiểu cấu hình, lưu hồ sơ người dùng:

Dict lồng nhau, giá trị có thể thay đổi, .get() với giá trị mặc định: bộ công cụ cơ bản cho mọi dữ liệu có dạng bản ghi.

Tiếp tục

List, tuple, set, dict. Với bốn kiểu tập hợp đó trong tay, bạn có thể mô hình hóa gần như mọi dữ liệu sẽ gặp ở giai đoạn đầu. Tiếp theo, chúng ta sẽ học list comprehension, cách viết gọn của Python để biến một tập hợp thành một tập hợp khác.

Câu hỏi thường gặp

Dictionary trong Python là gì?

Dictionary (từ điển) là tập hợp các cặp khóa và giá trị. Bạn tra một giá trị bằng khóa của nó: prices['apple'] thay vì prices[0]. Dict đọc và ghi nhanh, khóa phải là duy nhất, và trong Python hiện đại dict giữ nguyên thứ tự bạn thêm phần tử.

Làm sao thêm khóa vào dictionary trong Python?

Gán giá trị cho khóa đó: my_dict['new_key'] = 'new value'. Nếu khóa đã tồn tại, giá trị sẽ bị ghi đè. Nếu chưa, khóa được thêm mới. Không có sự phân biệt giữa "thêm" và "cập nhật": cùng một cú pháp.

dict[key] và dict.get(key) khác nhau thế nào?

dict[key] ném ra KeyError nếu khóa không có. dict.get(key) thì trả về None (hoặc giá trị mặc định bạn đưa vào). Dùng .get() khi việc thiếu khóa là bình thường và có thể xảy ra; dùng [key] khi thiếu khóa là bug.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu