🔄 12.3 Duyệt và xử lý dictionary
📖 Giới thiệu
Duyệt dictionary là kỹ năng quan trọng để xử lý dữ liệu. Bài học này sẽ hướng dẫn các cách duyệt khác nhau và các thao tác xử lý dữ liệu nâng cao với dictionary.
INFO
Dictionary cung cấp nhiều cách để duyệt và xử lý dữ liệu hiệu quả
🔍 Các cách duyệt dictionary
🔑 Duyệt keys (khóa)
python
# Điểm thi của học sinh
diem_thi = {
"Toán": 8.5,
"Lý": 9.0,
"Hóa": 7.5,
"Sinh": 8.0,
"Văn": 8.5,
"Anh": 7.0
}
# Duyệt tên các môn học
print("📚 Danh sách môn học:")
for mon_hoc in diem_thi.keys():
print(f" • {mon_hoc}")
# Đếm số môn có điểm >= 8
mon_gioi = 0
for mon in diem_thi.keys():
if diem_thi[mon] >= 8.0:
mon_gioi += 1
print(f"\n🏆 Số môn điểm giỏi (≥8): {mon_gioi}")📊 Duyệt values (giá trị)
python
# Lương nhân viên theo phòng ban
luong_phong_ban = {
"IT": [15000000, 18000000, 22000000, 16000000],
"Sales": [12000000, 14000000, 20000000],
"HR": [13000000, 16000000],
"Marketing": [14000000, 17000000, 19000000]
}
# Tính tổng lương của tất cả phòng ban
tong_luong_cong_ty = 0
for danh_sach_luong in luong_phong_ban.values():
tong_luong_phong = sum(danh_sach_luong)
tong_luong_cong_ty += tong_luong_phong
print(f"💰 Tổng lương công ty: {tong_luong_cong_ty:,} VND")
# Tìm lương cao nhất trong công ty
tat_ca_luong = []
for luong_list in luong_phong_ban.values():
tat_ca_luong.extend(luong_list)
luong_cao_nhat = max(tat_ca_luong)
print(f"🏆 Lương cao nhất: {luong_cao_nhat:,} VND")TIP
Sử dụng .extend() để gộp tất cả list con thành một list lớn
📋 Duyệt items (cặp key-value)
python
# Doanh số bán hàng theo quý
doanh_so_quy = {
"Q1_2024": 150000000,
"Q2_2024": 180000000,
"Q3_2024": 220000000,
"Q4_2024": 190000000
}
print("📊 BÁO CÁO DOANH SỐ")
print("="*40)
for quy, doanh_so in doanh_so_quy.items():
# Tính phần trăm so với mục tiêu (200M)
muc_tieu = 200000000
phan_tram = (doanh_so / muc_tieu) * 100
# Đánh giá
if phan_tram >= 100:
danh_gia = "🎯 Đạt mục tiêu"
elif phan_tram >= 80:
danh_gia = "⚠️ Gần đạt"
else:
danh_gia = "❌ Chưa đạt"
print(f"{quy}: {doanh_so:,} VND ({phan_tram:.1f}%) {danh_gia}")
# Tìm quý có doanh số cao nhất
quy_tot_nhat = max(doanh_so_quy.items(), key=lambda x: x[1])
print(f"\n🏆 Quý tốt nhất: {quy_tot_nhat[0]} - {quy_tot_nhat[1]:,} VND")🎯 Duyệt có điều kiện
python
# Kho hàng cửa hàng
kho_hang = {
"iPhone 15": {"gia": 25000000, "so_luong": 12, "danh_muc": "Điện thoại"},
"Samsung S24": {"gia": 22000000, "so_luong": 8, "danh_muc": "Điện thoại"},
"MacBook Air": {"gia": 35000000, "so_luong": 5, "danh_muc": "Laptop"},
"Dell XPS": {"gia": 28000000, "so_luong": 3, "danh_muc": "Laptop"},
"AirPods": {"gia": 5000000, "so_luong": 25, "danh_muc": "Phụ kiện"}
}
# Tìm sản phẩm sắp hết hàng (< 10)
print("⚠️ SẢN PHẨM SẮP HẾT HÀNG:")
for ten_sp, thong_tin in kho_hang.items():
if thong_tin["so_luong"] < 10:
print(f" • {ten_sp}: {thong_tin['so_luong']} chiếc")
# Tìm sản phẩm đắt tiền (> 20M)
print("\n💎 SẢN PHẨM CAO CẤP:")
for ten_sp, thong_tin in kho_hang.items():
if thong_tin["gia"] > 20000000:
gia = thong_tin["gia"]
print(f" • {ten_sp}: {gia:,} VND")
# Thống kê theo danh mục
danh_muc_count = {}
for ten_sp, thong_tin in kho_hang.items():
danh_muc = thong_tin["danh_muc"]
danh_muc_count[danh_muc] = danh_muc_count.get(danh_muc, 0) + 1
print(f"\n📊 Thống kê theo danh mục: {danh_muc_count}")🛠️ Xử lý dữ liệu nâng cao
🔄 Dictionary Comprehension
python
# Chuyển đổi nhiệt độ từ Celsius sang Fahrenheit
nhiet_do_c = {
"Hà Nội": 25,
"TP.HCM": 32,
"Đà Nẵng": 28,
"Cần Thơ": 30,
"Huế": 26
}
# Cách thông thường
nhiet_do_f = {}
for thanh_pho, celsius in nhiet_do_c.items():
fahrenheit = (celsius * 9/5) + 32
nhiet_do_f[thanh_pho] = fahrenheit
# Cách dùng dictionary comprehension (ngắn gọn hơn)
nhiet_do_f_v2 = {
thanh_pho: (celsius * 9/5) + 32
for thanh_pho, celsius in nhiet_do_c.items()
}
print("🌡️ Nhiệt độ Fahrenheit:")
for tp, temp in nhiet_do_f_v2.items():
print(f" {tp}: {temp:.1f}°F")
# Lọc thành phố có nhiệt độ cao
thanh_pho_nong = {
tp: temp for tp, temp in nhiet_do_c.items()
if temp > 27
}
print(f"\n🔥 Thành phố nóng (>27°C): {list(thanh_pho_nong.keys())}")INFO
Dictionary comprehension có cú pháp: {key: value for item in iterable if condition}
🗂️ Sắp xếp dictionary
python
# Bảng xếp hạng game
bang_xep_hang = {
"Player1": 1250,
"Player2": 980,
"Player3": 1450,
"Player4": 1100,
"Player5": 1380
}
# Sắp xếp theo điểm số (giảm dần)
xep_hang_theo_diem = sorted(
bang_xep_hang.items(),
key=lambda x: x[1],
reverse=True
)
print("🏆 BẢNG XẾP HẠNG:")
for thu_hang, (player, diem) in enumerate(xep_hang_theo_diem, 1):
if thu_hang == 1:
medal = "🥇"
elif thu_hang == 2:
medal = "🥈"
elif thu_hang == 3:
medal = "🥉"
else:
medal = f"{thu_hang}."
print(f" {medal} {player}: {diem} điểm")
# Tạo dictionary đã sắp xếp
bang_xep_hang_moi = dict(xep_hang_theo_diem)
print(f"\nTop 3: {list(bang_xep_hang_moi.keys())[:3]}")🏷️ Nhóm dữ liệu
python
# Danh sách học sinh với thông tin lớp
hoc_sinh = [
{"ten": "An", "lop": "10A1", "diem": 8.5},
{"ten": "Bình", "lop": "10A2", "diem": 7.2},
{"ten": "Chi", "lop": "10A1", "diem": 9.1},
{"ten": "Dung", "lop": "10A3", "diem": 8.0},
{"ten": "Em", "lop": "10A1", "diem": 7.8},
{"ten": "Giang", "lop": "10A2", "diem": 8.7}
]
# Nhóm học sinh theo lớp
nhom_theo_lop = {}
for hs in hoc_sinh:
lop = hs["lop"]
if lop not in nhom_theo_lop:
nhom_theo_lop[lop] = []
nhom_theo_lop[lop].append(hs)
# In kết quả nhóm
print("👥 DANH SÁCH THEO LỚP:")
for lop, ds_hs in nhom_theo_lop.items():
print(f"\n📚 Lớp {lop} ({len(ds_hs)} học sinh):")
# Tính điểm trung bình lớp
tong_diem = sum(hs["diem"] for hs in ds_hs)
diem_tb_lop = tong_diem / len(ds_hs)
for hs in ds_hs:
print(f" • {hs['ten']}: {hs['diem']}")
print(f" 📊 Điểm TB lớp: {diem_tb_lop:.2f}")🧮 Thống kê và phân tích
📊 Phân tích dữ liệu bán hàng
python
# Dữ liệu bán hàng theo sản phẩm và tháng
ban_hang_2024 = {
"iPhone": [45, 52, 48, 55, 60, 58, 62, 59, 56, 63, 67, 70],
"Samsung": [38, 42, 40, 45, 48, 46, 50, 47, 44, 51, 54, 57],
"Laptop": [12, 15, 18, 20, 22, 25, 28, 26, 24, 30, 32, 35],
"Tablet": [8, 10, 12, 14, 16, 18, 20, 18, 16, 22, 24, 26]
}
def phan_tich_ban_hang(data):
"""Phân tích dữ liệu bán hàng chi tiết"""
print("📊 PHÂN TÍCH BÁN HÀNG NĂM 2024")
print("="*50)
thong_ke = {}
for san_pham, so_luong_thang in data.items():
# Tính các chỉ số
tong_ban = sum(so_luong_thang)
tb_thang = tong_ban / 12
max_thang = max(so_luong_thang)
min_thang = min(so_luong_thang)
# Tìm tháng bán nhiều nhất
thang_max = so_luong_thang.index(max_thang) + 1
thong_ke[san_pham] = {
"tong": tong_ban,
"tb_thang": tb_thang,
"max": max_thang,
"min": min_thang,
"thang_tot_nhat": thang_max
}
print(f"\n📱 {san_pham}:")
print(f" Tổng bán: {tong_ban} chiếc")
print(f" TB/tháng: {tb_thang:.1f} chiếc")
print(f" Tháng tốt nhất: Tháng {thang_max} ({max_thang} chiếc)")
print(f" Biên độ: {min_thang} - {max_thang} chiếc")
# Tìm sản phẩm bán chạy nhất
sp_ban_chay = max(thong_ke.items(), key=lambda x: x[1]["tong"])
print(f"\n🏆 Sản phẩm bán chạy nhất: {sp_ban_chay[0]} ({sp_ban_chay[1]['tong']} chiếc)")
return thong_ke
# Thực hiện phân tích
thong_ke_ban_hang = phan_tich_ban_hang(ban_hang_2024)📈 Tính xu hướng tăng trưởng
python
def tinh_tang_truong(data_thang):
"""Tính tỷ lệ tăng trưởng qua các tháng"""
tang_truong = []
for i in range(1, len(data_thang)):
thang_truoc = data_thang[i-1]
thang_hien_tai = data_thang[i]
if thang_truoc > 0: # Tránh chia cho 0
ty_le = ((thang_hien_tai - thang_truoc) / thang_truoc) * 100
tang_truong.append(ty_le)
return tang_truong
# Phân tích xu hướng cho từng sản phẩm
print("\n📈 XU HƯỚNG TĂNG TRƯỞNG:")
print("="*40)
for san_pham, data_thang in ban_hang_2024.items():
tang_truong = tinh_tang_truong(data_thang)
tb_tang_truong = sum(tang_truong) / len(tang_truong)
if tb_tang_truong > 0:
xu_huong = "📈 Tăng"
elif tb_tang_truong < 0:
xu_huong = "📉 Giảm"
else:
xu_huong = "➡️ Ổn định"
print(f"{san_pham}: {xu_huong} ({tb_tang_truong:+.1f}%/tháng)")Bài tập thực hành
Bài 1: Phân tích điểm thi Cho dictionary điểm thi của nhiều học sinh:
- Tính điểm trung bình từng môn
- Tìm học sinh có tổng điểm cao nhất
- Thống kê số học sinh đạt/không đạt từng môn
Bài 2: Quản lý thư viện Dictionary sách với thông tin: tác giả, năm xuất bản, thể loại
- Nhóm sách theo thể loại
- Tìm sách mới nhất/cũ nhất
- Thống kê sách theo tác giả
Bài 3: Phân tích website Dictionary lượng truy cập theo ngày:
- Tính trung bình truy cập/ngày
- Tìm ngày có lượng truy cập cao/thấp nhất
- Tính xu hướng tăng/giảm
📚 Tóm tắt
Các cách duyệt:
.keys(): Duyệt keys.values(): Duyệt values.items(): Duyệt cặp key-value- Duyệt có điều kiện với
if
Xử lý dữ liệu:
- Dictionary comprehension:
{k: v for item in data if condition} - Sắp xếp:
sorted(dict.items(), key=lambda x: x[1]) - Nhóm dữ liệu: Sử dụng dictionary để phân loại
Thống kê:
sum(),max(),min()cho values- Tính trung bình, tỷ lệ phần trăm
- Phân tích xu hướng qua thời gian
Lời khuyên
Kết hợp nhiều kỹ thuật duyệt và xử lý để phân tích dữ liệu hiệu quả