Skip to content

🛠️ 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àn
  • key 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()in operator để tránh lỗi khi làm việc với dictionary

🐍 Khóa học Python căn bản bằng tiếng Việt