🛠️ 12.2 Các thao tác với dictionary
📖 Giới thiệu
Dictionary cung cấp nhiều phương thức và thao tác hữu ích để làm việc với dữ liệu key-value. Bài học này sẽ hướng dẫn các thao tác cơ bản và nâng cao với dictionary.
INFO
Dictionary có nhiều phương thức hữu ích như .get(), .keys(), .values(), .items()
➕ Thêm và sửa đổi
📝 Thêm phần tử mới
python
# Tạo dictionary trống
hoc_sinh = {}
# Thêm thông tin
hoc_sinh["ten"] = "Nguyễn Văn An"
hoc_sinh["tuoi"] = 16
hoc_sinh["lop"] = "10A1"
hoc_sinh["diem_tb"] = 8.5
print("Thông tin học sinh:", hoc_sinh)
# Thêm nhiều thông tin cùng lúc
them_info = {
"que_quan": "Hà Nội",
"so_thich": ["đọc sách", "bóng đá"],
"hoc_bong": True
}
hoc_sinh.update(them_info)
print("Sau khi cập nhật:", hoc_sinh)TIP
Sử dụng .update() để thêm nhiều cặp key-value cùng lúc
🔄 Sửa đổi giá trị
python
# Dictionary sản phẩm
san_pham = {
"ten": "iPhone 15",
"gia": 25000000,
"so_luong": 50,
"mau_sac": ["đen", "trắng", "xanh"]
}
print("Trước khi sửa:", san_pham)
# Sửa giá
san_pham["gia"] = 23000000
# Thêm màu mới
san_pham["mau_sac"].append("hồng")
# Cập nhật số lượng
san_pham["so_luong"] -= 5 # Bán 5 chiếc
print("Sau khi sửa:", san_pham)🆕 Sử dụng setdefault()
python
# Đếm số lần xuất hiện của ký tự
text = "hello world"
dem_ky_tu = {}
for char in text:
# setdefault: nếu key không tồn tại thì tạo với giá trị mặc định
dem_ky_tu.setdefault(char, 0)
dem_ky_tu[char] += 1
print("Đếm ký tự:", dem_ky_tu)
# Nhóm học sinh theo lớp
hoc_sinh_list = [
{"ten": "An", "lop": "10A1"},
{"ten": "Bình", "lop": "10A2"},
{"ten": "Chi", "lop": "10A1"},
{"ten": "Dung", "lop": "10A3"},
{"ten": "Em", "lop": "10A1"}
]
nhom_lop = {}
for hs in hoc_sinh_list:
lop = hs["lop"]
nhom_lop.setdefault(lop, [])
nhom_lop[lop].append(hs["ten"])
print("Nhóm theo lớp:", nhom_lop)❌ Xóa phần tử
🗑️ Các cách xóa khác nhau
python
# Dictionary ban đầu
kho_hang = {
"iphone": 50,
"samsung": 30,
"laptop": 25,
"tablet": 40,
"headphone": 100
}
print("Kho hàng ban đầu:", kho_hang)
# 1. Xóa bằng del
del kho_hang["tablet"]
print("Sau khi xóa tablet:", kho_hang)
# 2. Xóa bằng pop() (trả về giá trị)
so_luong_laptop = kho_hang.pop("laptop")
print(f"Đã lấy {so_luong_laptop} laptop ra khỏi kho")
print("Kho hàng hiện tại:", kho_hang)
# 3. Xóa bằng pop() với giá trị mặc định
so_luong_camera = kho_hang.pop("camera", 0)
print(f"Số lượng camera: {so_luong_camera}")
# 4. Xóa và lấy phần tử cuối cùng
ten_sp, so_luong = kho_hang.popitem()
print(f"Lấy ra: {ten_sp} = {so_luong}")
print("Kho hàng còn lại:", kho_hang)WARNING
del dict[key] sẽ báo lỗi nếu key không tồn tại. Dùng .pop(key, default) an toàn hơn
🧹 Xóa toàn bộ
python
# Xóa tất cả phần tử
diem_thi = {
"Toán": 8,
"Lý": 9,
"Hóa": 7
}
print("Trước khi xóa:", len(diem_thi))
diem_thi.clear()
print("Sau khi xóa:", len(diem_thi))
print("Dictionary rỗng:", diem_thi)🔍 Truy cập an toàn
🛡️ Sử dụng get()
python
# Thông tin cá nhân
profile = {
"name": "Trần Thị B",
"age": 17,
"city": "Hà Nội"
}
# Cách không an toàn (có thể lỗi)
# print(profile["phone"]) # KeyError!
# Cách an toàn với get()
phone = profile.get("phone", "Chưa cập nhật")
email = profile.get("email", "Không có")
print(f"Tên: {profile.get('name')}")
print(f"Tuổi: {profile.get('age')}")
print(f"Điện thoại: {phone}")
print(f"Email: {email}")
# Hàm tiện ích để in thông tin
def in_profile(profile_dict):
cac_field = ["name", "age", "city", "phone", "email"]
for field in cac_field:
gia_tri = profile_dict.get(field, "N/A")
print(f"{field.title()}: {gia_tri}")
in_profile(profile)❓ Kiểm tra key tồn tại
python
# Menu nhà hàng
menu = {
"pho": 50000,
"bun_bo": 45000,
"com_tam": 40000,
"banh_mi": 25000
}
def kiem_tra_mon(ten_mon):
"""Kiểm tra món ăn có trong menu không"""
if ten_mon in menu:
gia = menu[ten_mon]
print(f"✅ {ten_mon}: {gia:,} VND")
return True
else:
print(f"❌ Không có món {ten_mon}")
return False
# Test
kiem_tra_mon("pho")
kiem_tra_mon("pizza")
# Kiểm tra nhiều món
mon_goi = ["pho", "bun_bo", "pizza", "banh_mi"]
tong_tien = 0
print("\n🍽️ Đơn hàng:")
for mon in mon_goi:
if mon in menu:
gia = menu[mon]
tong_tien += gia
print(f" {mon}: {gia:,} VND")
else:
print(f" {mon}: Không có")
print(f"💰 Tổng: {tong_tien:,} VND")🔄 Duyệt dictionary
🔑 Duyệt keys, values, items
python
# Điểm số học sinh
diem_so = {
"Toán": 8.5,
"Lý": 9.0,
"Hóa": 7.5,
"Sinh": 8.0,
"Văn": 8.5
}
# 1. Duyệt keys (tên môn)
print("📚 Các môn học:")
for mon in diem_so.keys():
print(f" • {mon}")
# 2. Duyệt values (điểm số)
print("\n📊 Các điểm số:")
for diem in diem_so.values():
print(f" • {diem}")
# 3. Duyệt items (cả key và value)
print("\n📋 Bảng điểm:")
for mon, diem in diem_so.items():
if diem >= 8.0:
print(f" ✅ {mon}: {diem}")
else:
print(f" ⚠️ {mon}: {diem}")
# Tính thống kê
tong_diem = sum(diem_so.values())
so_mon = len(diem_so)
diem_tb = tong_diem / so_mon
print(f"\n📊 Tổng điểm: {tong_diem}")
print(f"📊 Điểm TB: {diem_tb:.2f}")TIP
Sử dụng .items() khi cần cả key và value, .keys() khi chỉ cần key, .values() khi chỉ cần value
🔄 Ví dụ thực tế: Quản lý bán hàng
python
# Doanh thu theo tháng
doanh_thu = {
"Jan": 15000000,
"Feb": 18000000,
"Mar": 22000000,
"Apr": 19000000,
"May": 25000000,
"Jun": 28000000
}
def phan_tich_doanh_thu(dt_dict):
"""Phân tích doanh thu chi tiết"""
print("📊 PHÂN TÍCH DOANH THU")
print("="*40)
# Tháng có doanh thu cao nhất
thang_max = max(dt_dict.items(), key=lambda x: x[1])
print(f"🏆 Tháng tốt nhất: {thang_max[0]} - {thang_max[1]:,} VND")
# Tháng có doanh thu thấp nhất
thang_min = min(dt_dict.items(), key=lambda x: x[1])
print(f"📉 Tháng thấp nhất: {thang_min[0]} - {thang_min[1]:,} VND")
# Tổng doanh thu
tong = sum(dt_dict.values())
print(f"💰 Tổng doanh thu: {tong:,} VND")
# Doanh thu trung bình
tb = tong / len(dt_dict)
print(f"📊 TB/tháng: {tb:,} VND")
# Tăng trưởng so với tháng trước
print("\n📈 Tăng trưởng:")
cac_thang = list(dt_dict.keys())
for i in range(1, len(cac_thang)):
thang_truoc = cac_thang[i-1]
thang_hien_tai = cac_thang[i]
dt_truoc = dt_dict[thang_truoc]
dt_hien_tai = dt_dict[thang_hien_tai]
tang_truong = ((dt_hien_tai - dt_truoc) / dt_truoc) * 100
if tang_truong > 0:
print(f" ↗️ {thang_hien_tai}: +{tang_truong:.1f}%")
else:
print(f" ↘️ {thang_hien_tai}: {tang_truong:.1f}%")
phan_tich_doanh_thu(doanh_thu)📝 Bài tập thực hành
Bài tập 1: Quản lý sinh viên
Tạo dictionary lưu thông tin sinh viên và thực hiện:
- Thêm sinh viên mới
- Cập nhật điểm số
- Xóa sinh viên
- Tìm sinh viên có điểm cao nhất
python
# Đáp án
sinh_vien = {
"SV001": {"ten": "An", "diem": 8.5, "lop": "CNTT1"},
"SV002": {"ten": "Bình", "diem": 7.2, "lop": "CNTT2"},
"SV003": {"ten": "Chi", "diem": 9.1, "lop": "CNTT1"}
}
# Thêm sinh viên
sinh_vien["SV004"] = {"ten": "Dung", "diem": 8.0, "lop": "CNTT2"}
# Cập nhật điểm
sinh_vien["SV002"]["diem"] = 8.0
# Tìm điểm cao nhất
sv_max = max(sinh_vien.items(), key=lambda x: x[1]["diem"])
print(f"Điểm cao nhất: {sv_max[1]['ten']} - {sv_max[1]['diem']}")📚 Tóm tắt
Thêm/Sửa:
dict[key] = value: Thêm hoặc sửa.update(): Cập nhật nhiều cặp key-value.setdefault(): Thêm nếu key chưa tồn tại
Xóa:
del dict[key]: Xóa key (lỗi nếu không tồn tại).pop(key, default): Xóa và trả về value.clear(): Xóa tất cả
Truy cập:
dict[key]: Truy cập trực tiếp (lỗi nếu không tồn tại).get(key, default): Truy cập an toànkey in dict: Kiểm tra key tồn tại
Duyệt:
.keys(): Duyệt keys.values(): Duyệt values.items(): Duyệt cặp key-value
Lời khuyên
Luôn sử dụng .get() và in operator để tránh lỗi khi làm việc với dictionary