tinbc tinbc

Bài 7: Dictionary trong Python

Thợ Code5 phút đọc4 lượt xem
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

  • KeyError khi tra khóa không tồn tại bằng dic[key] → dùng .get(key) hoặc kiểm tra if key in dic trước.
  • del dic[key] khi khóa không có → cũng KeyError. Kiểm tra in trướ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ặp khóa: giá_trị; {} rỗng là dict rỗng (set rỗng phải viết set()).
  • Đọ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

  1. {"a": 1}["a"] cho gì? (Đáp án: 1)
  2. .get("x") khi “x” không có trả về gì? (Đáp án: None)
  3. 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 tra in trướ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).

Chia sẻ:
0.0 ★ 0 lượt đánh giá

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

Thợ Code

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

AI có thay thế lập trình viên không? Góc nhìn thực tế
Lập trình

AI có thay thế lập trình viên không? Góc nhìn thực tế

AI viết code ngày càng giỏi khiến nhiều người lo: liệu lập trình viên có bị thay thế? Bài này đưa góc nhìn thực tế — AI làm được gì, chưa làm được gì, nghề lập trình đang thay đổi ra sao, và người mới nên học gì để không bị bỏ lại.

7 lượt xem
Frontend, backend hay fullstack: nên theo hướng nào?
Lập trình

Frontend, backend hay fullstack: nên theo hướng nào?

Mới học lập trình web và phân vân giữa frontend, backend hay fullstack? Bài này giải thích rõ mỗi hướng làm gì, cần kỹ năng nào, hợp với ai, cơ hội việc làm ra sao — và lời khuyên thực tế cho người mới chọn đường.

1 lượt xem
10 dự án nhỏ để luyện lập trình cho người mới
Lập trình

10 dự án nhỏ để luyện lập trình cho người mới

Học cú pháp mãi mà không tiến bộ? Cách nhanh nhất để giỏi lập trình là làm dự án nhỏ. Bài này gợi ý 10 dự án tăng dần độ khó — từ máy tính bỏ túi tới ứng dụng ghi chú — kèm kỹ năng mỗi dự án rèn và cách bắt tay làm.

1 lượt xem