Bài 7: Dictionary trong Python

Bài 6 bạn đã gom giá trị bằng list, tuple, set. Giờ ta học kiểu gom mạnh và hay dùng bậc nhất: dictionary (từ điển) — lưu dữ liệu theo cặp khóa–giá trị và tra ra tức thì. Cuối bài bạn tự viết một chương trình danh bạ điện thoại (thêm, tra, xóa liên hệ) — chạy ra kết quả thật.
⏱️ Cách học bài này (~30 phút): đọc khái niệm + code mẫu (10’), tự gõ và chạy các bài thực hành (12’), xem lỗi thường gặp (4’), tự kiểm + lưu code mang về (4’).
Mục tiêu bài học
Sau bài này bạn sẽ:
- Tạo dictionary và tra giá trị theo khóa.
- Dùng .get() an toàn, thêm/sửa/xóa cặp khóa–giá trị.
- Duyệt dictionary bằng
.items(),.keys(),.values(). - Tự viết chương trình danh bạ điện thoại — thêm vào kho code cá nhân.
Nội dung: dictionary (từ điển)
1. Tạo và tra theo khóa
Dictionary viết trong { }, mỗi cặp là khóa: giá_trị:
danh_ba = {"Lan": "0912", "Nam": "0987"}
print(danh_ba["Lan"]) # 0912 — tra theo khóa
print(len(danh_ba)) # 2 — số cặp
Khóa thường là chuỗi (tên), giá trị là thứ bạn cần lưu (số điện thoại).
2. Thêm, sửa, xóa
danh_ba["Hoa"] = "0900" # thêm cặp mới
danh_ba["Lan"] = "0911" # sửa: gán lại khóa đã có
del danh_ba["Nam"] # xóa theo khóa
print(danh_ba) # {'Lan': '0911', 'Hoa': '0900'}
3. .get() an toàn & kiểm tra tồn tại
Tra khóa không tồn tại bằng [] sẽ lỗi; dùng .get() để an toàn:
print(danh_ba.get("Minh")) # None — không lỗi
print(danh_ba.get("Minh", "chưa có")) # "chưa có" — giá trị mặc định
print("Lan" in danh_ba) # True — kiểm tra khóa
4. Duyệt dictionary
for ten, so in danh_ba.items(): # duyệt cả khóa và giá trị
print(f"{ten}: {so}")
.keys() cho danh sách khóa, .values() cho danh sách giá trị.
Code mẫu có chú thích: danh bạ điện thoại
danh_ba = {} # từ điển rỗng
while True:
lenh = input("Thêm (a), Tra (t), Xóa (x), Xem (v), Thoát (q): ")
if lenh == "a":
ten = input("Tên: ")
danh_ba[ten] = input("Số điện thoại: ") # thêm/sửa cặp
elif lenh == "t":
ten = input("Tra tên: ")
print(danh_ba.get(ten, "Không tìm thấy")) # .get() an toàn
elif lenh == "x":
ten = input("Xóa tên: ")
if ten in danh_ba: # kiểm tra trước khi xóa
del danh_ba[ten]
else:
print("Không có tên này.")
elif lenh == "v":
for ten, so in danh_ba.items():
print(f"- {ten}: {so}")
elif lenh == "q":
break
Mấu chốt: danh_ba[ten] = so để thêm/sửa, .get(ten, "...") để tra an toàn, del để xóa (kiểm tra in trước), .items() để liệt kê.
Bài thực hành code (tự gõ)
Bài 1 — Tra giá: cho gia = {"táo": 20000, "sữa": 15000}, in giá của “táo”.
Bài 2 — Đếm bằng dictionary: cho một câu, đếm số lần mỗi từ xuất hiện bằng dict.
✅ Gợi ý: dem[tu] = dem.get(tu, 0) + 1 trong vòng lặp for tu in cau.split().
Bài 3 — Danh bạ nhỏ: tạo dict 3 liên hệ, rồi in tất cả bằng .items(), và tra một tên không có bằng .get() để thấy nó không lỗi.
Lỗi thường gặp & cách sửa
KeyErrorkhi tra khóa không tồn tại bằngdic[key]→ dùng.get(key)hoặc kiểm traif key in dictrước.del dic[key]khi khóa không có → cũngKeyError. Kiểm traintrước khi xóa.- Khóa trùng → gán lại khóa cũ sẽ ghi đè giá trị, không tạo cặp mới. Đây là tính chất, không phải lỗi.
- Nhầm
{}của dict và set → dict có cặpkhóa: giá_trị;{}rỗng là dict rỗng (set rỗng phải viếtset()). - Đọc kỹ thông báo lỗi: xem cách đọc lỗi và debug cho người mới.
💾 Mang về — danh bạ điện thoại
Lưu vào kho code cá nhân (bài L7 trong series):
# danh_ba.py — danh bạ đơn giản bằng dictionary
danh_ba = {}
while True:
lenh = input("Thêm (a), Tra (t), Xóa (x), Xem (v), Thoát (q): ")
if lenh == "a":
ten = input("Tên: ")
danh_ba[ten] = input("Số: ")
elif lenh == "t":
print(danh_ba.get(input("Tra tên: "), "Không tìm thấy"))
elif lenh == "x":
ten = input("Xóa tên: ")
if ten in danh_ba:
del danh_ba[ten]
else:
print("Không có.")
elif lenh == "v":
for ten, so in danh_ba.items():
print(f"- {ten}: {so}")
elif lenh == "q":
break
Thuật ngữ chốt
| Thuật ngữ | Giải thích ngắn |
|---|---|
| dictionary (dict) | Lưu dữ liệu theo cặp khóa–giá trị, trong {} |
| key / value | Khóa (để tra) / giá trị (dữ liệu lưu) |
| dic[key] | Tra giá trị theo khóa (lỗi nếu khóa không có) |
| .get(key, mặc_định) | Tra an toàn, trả mặc định nếu khóa không có |
| .items() / .keys() / .values() | Duyệt cặp / khóa / giá trị |
| del dic[key] | Xóa một cặp theo khóa |
Tự kiểm tra & lời giải
{"a": 1}["a"]cho gì? (Đáp án: 1).get("x")khi “x” không có trả về gì? (Đáp án: None)- Vì sao gán
dic["Lan"] = "..."khi “Lan” đã có lại không tạo cặp mới? (Đáp án: khóa trùng thì ghi đè giá trị cũ)
Lời giải Bài thực hành:
# Bài 1
gia = {"táo": 20000, "sữa": 15000}
print(gia["táo"]) # 20000
# Bài 2
cau = "python rất vui python dễ"
dem = {}
for tu in cau.split():
dem[tu] = dem.get(tu, 0) + 1
print(dem) # {'python': 2, 'rất': 1, 'vui': 1, 'dễ': 1}
# Bài 3
lienhe = {"Lan": "0912", "Nam": "0987", "Hoa": "0900"}
for ten, so in lienhe.items():
print(ten, so)
print(lienhe.get("Minh", "không có")) # không có
Ghi nhớ nhanh
- Dict lưu khóa: giá trị, tra theo khóa:
dic[key]; an toàn hơn:.get(key, mặc_định). - Thêm/sửa:
dic[key] = value; xóa:del dic[key](kiểm traintrước). - Duyệt:
for k, v in dic.items():.
👉 Bài tập về nhà: nâng cấp danh bạ để khi tra tên không có thì hỏi “Thêm mới không?” rồi cho thêm luôn. Bài tiếp theo trong series: Bài 8 — Hàm (function) (sắp đăng).
Câu hỏi thường gặp
Dictionary trong Python là gì?
Dictionary (dict) là kiểu dữ liệu lưu theo cặp khóa–giá trị (key–value), viết trong ngoặc nhọn {}. Ví dụ danh_ba = {‘Lan’: ‘0912’, ‘Nam’: ‘0987’}. Bạn tra giá trị bằng khóa: danh_ba[‘Lan’] cho ‘0912’. Nó lý tưởng khi cần ánh xạ một thứ sang thứ khác — tên sang số điện thoại, mã sản phẩm sang giá.
dic[key] và dic.get(key) khác nhau thế nào?
Cả hai đều lấy giá trị theo khóa, nhưng nếu khóa KHÔNG tồn tại: dic[key] gây lỗi KeyError làm dừng chương trình, còn dic.get(key) trả về None (hoặc giá trị mặc định bạn đặt, ví dụ dic.get(key, ‘không có’)). Với người mới, .get() an toàn hơn khi không chắc khóa có tồn tại.
Làm sao duyệt qua tất cả cặp trong dictionary?
Dùng vòng for với .items(): ‘for ten, so in danh_ba.items(): print(ten, so)’. Ngoài ra .keys() cho danh sách khóa, .values() cho danh sách giá trị. Kiểm tra một khóa có tồn tại không bằng toán tử in: ‘if “Lan” in danh_ba’.
Thợ code chính hiệu, thích dắt người mới qua mấy đoạn 'khó nhằn' bằng giọng nhẹ tênh. Châm ngôn: cứ làm dự án thật, sai thì sửa, vui là chính.
Bài liên quan

Bài 6: CSS — bố cục với Flexbox
Bài 6 series Web cơ bản (bài học 30 phút): dùng Flexbox để xếp các khối thành hàng, căn giữa và chia đều khoảng cách — biến trang cá nhân thành có bố cục thật; kèm thực hành và file mang về.

Cấu trúc dữ liệu và thuật toán cơ bản cần biết
Cấu trúc dữ liệu và thuật toán nghe đáng sợ nhưng nền tảng lại đơn giản và cực hữu ích. Bài này giải thích dễ hiểu những thứ cơ bản nhất mọi người học code nên biết — và khi nào dùng cái gì.

Xây dựng website đầu tiên với Next.js (cho người mới)
Next.js là cách phổ biến để dựng website React hiện đại. Bài này dắt bạn từ cài đặt, tạo dự án với create-next-app, sửa trang đầu tiên, tới đưa web lên mạng miễn phí bằng Vercel.