Cách đọc dữ liệu Dictionary Python

Python Tutorial | by Hoc Python

Sau khi đã hiểu rõ Dictionary là gì và cách tạo ra chúng, bước tiếp theo và cũng là một trong những thao tác quan trọng nhất chính là cách đọc (hay truy cập) dữ liệu từ Dictionary. Một Dictionary chứa đựng vô vàn thông tin hữu ích dưới dạng các cặp "khóa-giá trị" có cấu trúc. Tuy nhiên, nếu không biết cách "mở khóa" và lấy ra những giá trị mà chúng ta cần, thì toàn bộ dữ liệu đó sẽ trở nên vô dụng.

Trong phần này, mình sẽ cùng nhau đi sâu vào các phương pháp khác nhau để truy cập dữ liệu từ Dictionary. Từ những cách đơn giản và trực tiếp nhất, đến những kỹ thuật an toàn hơn giúp tránh lỗi, và cả cách để duyệt qua toàn bộ nội dung của một Dictionary. Nắm vững những kỹ thuật này sẽ giúp bạn khai thác tối đa sức mạnh của Dictionary, biến chúng thành công cụ đắc lực trong việc quản lý và xử lý dữ liệu trong các ứng dụng Python của mình. Hãy cùng bắt đầu nhé!

Các phương pháp đọc dữ liệu chính trong Python

Để lấy một giá trị cụ thể từ Dictionary, bạn sẽ cần sử dụng khóa (key) tương ứng của nó. Có hai phương pháp chính để làm điều này: sử dụng dấu ngoặc vuông [] và sử dụng phương thức get().

Sử dụng dấu ngoặc vuông [] (Truy cập trực tiếp)

Đây là cách phổ biến và đơn giản nhất để truy cập giá trị trong Dictionary. Bạn chỉ cần đặt khóa của phần tử bạn muốn lấy vào bên trong dấu ngoặc vuông [] ngay sau tên của Dictionary.

  • Khái niệm: Dùng khóa đặt trong [] để lấy giá trị tương ứng.

  • Cú pháp cơ bản: gia_tri = ten_dictionary[khóa]

  • Ưu điểm: Đơn giản, trực tiếp, dễ đọc và viết.

  • Nhược điểm: Sẽ gây lỗi KeyError nếu khóa bạn cố gắng truy cập không tồn tại trong dictionary.

Ví dụ minh họa:

# Tạo một dictionary lưu trữ thông tin về một thành phố
thanh_pho = {
    "ten": "Hà Nội",
    "quoc_gia": "Việt Nam",
    "dan_so": 8000000,
    "dien_tich": 3359 # km2
}

# Truy cập giá trị bằng khóa
ten_thanh_pho = thanh_pho["ten"]
dan_so_thanh_pho = thanh_pho["dan_so"]

print(f"Tên thành phố: {ten_thanh_pho}")
print(f"Dân số: {dan_so_thanh_pho}")

# Ví dụ về lỗi KeyError khi truy cập khóa không tồn tại
print("\n--- Ví dụ gây lỗi KeyError ---")
try:
    # Khóa "ma_vung" không tồn tại trong dictionary 'thanh_pho'
    ma_vung = thanh_pho["ma_vung"]
    print(f"Mã vùng: {ma_vung}")
except KeyError:
    print("Lỗi: Khóa 'ma_vung' không tồn tại trong dictionary!")

# Output:
# Tên thành phố: Hà Nội
# Dân số: 8000000
#
# --- Ví dụ gây lỗi KeyError ---
# Lỗi: Khóa 'ma_vung' không tồn tại trong dictionary!

Sử dụng phương thức get() (Truy cập an toàn hơn)

Phương thức get() là một cách thay thế để truy cập giá trị, với ưu điểm lớn là nó giúp tránh lỗi KeyError khi khóa không tồn tại.

Khái niệm: Một phương thức của dictionary cho phép bạn lấy giá trị.

Cú pháp cơ bản:

  • gia_tri = ten_dictionary.get(khóa): Nếu khóa tồn tại, trả về giá trị. Nếu không, trả về None.

  • gia_tri = ten_dictionary.get(khóa, giá_trị_mặc_định): Nếu khóa tồn tại, trả về giá trị. Nếu không, trả về giá_trị_mặc_định mà bạn chỉ định.

Ưu điểm:

  • Không gây lỗi KeyError: Đây là ưu điểm chính. Chương trình của bạn sẽ không bị dừng đột ngột nếu khóa không tìm thấy.

  • Kiểm soát tốt hơn khi khóa có thể không tồn tại, giúp xử lý các trường hợp này một cách linh hoạt.

Nhược điểm: Cú pháp hơi dài hơn so với việc sử dụng [].

Ví dụ minh họa:

# Tiếp tục sử dụng dictionary 'thanh_pho'
thanh_pho = {
    "ten": "Hà Nội",
    "quoc_gia": "Việt Nam",
    "dan_so": 8000000
}

print("--- Sử dụng get() ---")

# Truy cập khóa tồn tại
quoc_gia = thanh_pho.get("quoc_gia")
print(f"Quốc gia: {quoc_gia}") # Output: Quốc gia: Việt Nam

# Truy cập khóa không tồn tại (sẽ trả về None)
ngon_ngu = thanh_pho.get("ngon_ngu")
print(f"Ngôn ngữ (khóa không tồn tại): {ngon_ngu}") # Output: Ngôn ngữ (khóa không tồn tại): None

# Truy cập khóa không tồn tại với giá trị mặc định
ma_dien_thoai = thanh_pho.get("ma_dien_thoai", "+84")
print(f"Mã điện thoại (với giá trị mặc định): {ma_dien_thoai}") # Output: Mã điện thoại (với giá trị mặc định): +84

# Truy cập khóa tồn tại với giá trị mặc định (giá trị thực sẽ được trả về)
dan_so_safe = thanh_pho.get("dan_so", 0)
print(f"Dân số (khóa tồn tại, có mặc định): {dan_so_safe}") # Output: Dân số (khóa tồn tại, có mặc định): 8000000

Khi nào nên dùng [] và khi nào nên dùng get()?

  • Sử dụng [] khi bạn chắc chắn rằng khóa đó tồn tại và bạn muốn chương trình báo lỗi nếu nó không có (ví dụ: một khóa bắt buộc).Sử dụng get() khi bạn không chắc chắn khóa đó có tồn tại hay không, và bạn muốn chương trình tiếp tục chạy mà không bị lỗi, đồng thời có thể cung cấp một giá trị thay thế nếu khóa không tìm thấy.

Kiểm tra sự tồn tại của khóa trước khi đọc trong Python

Để tránh gặp lỗi KeyError khi sử dụng dấu ngoặc vuông [] để truy cập giá trị, bạn nên kiểm tra xem khóa đó có tồn tại trong dictionary hay không trước khi thực hiện truy cập.

Sử dụng từ khóa in

Từ khóa in là cách đơn giản và hiệu quả nhất để kiểm tra sự tồn tại của một khóa trong dictionary. Nó sẽ trả về True nếu khóa tồn tại và False nếu không.

  • Khái niệm: Kiểm tra xem một khóa có tồn tại trong dictionary hay không. Trả về True hoặc False.

  • Cú pháp: khóa in ten_dictionary

  • Ứng dụng: Thường được sử dụng trong câu lệnh điều kiện if để kiểm tra trước khi thực hiện các thao tác truy cập hoặc xử lý dữ liệu.

Ví dụ minh họa:

# Tạo một dictionary về cài đặt ứng dụng
cai_dat_ung_dung = {
    "ngon_ngu": "Tiếng Việt",
    "che_do_toi": True,
    "kich_thuoc_font": 16
}

# Kiểm tra sự tồn tại của khóa "ngon_ngu"
if "ngon_ngu" in cai_dat_ung_dung:
    print(f"Ngôn ngữ cài đặt: {cai_dat_ung_dung['ngon_ngu']}")
else:
    print("Không tìm thấy cài đặt ngôn ngữ.")

# Kiểm tra sự tồn tại của khóa "chu_de"
if "chu_de" in cai_dat_ung_dung:
    print(f"Chủ đề: {cai_dat_ung_dung['chu_de']}")
else:
    print("Không tìm thấy cài đặt chủ đề. Sử dụng chủ đề mặc định.")

# Output:
# Ngôn ngữ cài đặt: Tiếng Việt
# Không tìm thấy cài đặt chủ đề. Sử dụng chủ đề mặc định.

Bạn cũng có thể sử dụng not in để kiểm tra xem một khóa có không tồn tại hay không:

if "phien_ban" not in cai_dat_ung_dung:
    cai_dat_ung_dung["phien_ban"] = "1.0.0"
    print(f"Đã thêm phiên bản mặc định: {cai_dat_ung_dung['phien_ban']}")
# Output: Đã thêm phiên bản mặc định: 1.0.0

Kết hợp get() với giá trị mặc định (nhắc lại)

Như đã đề cập ở phần trước, phương thức get() với tham số giá_trị_mặc_định là một cách rất hiệu quả để vừa đọc dữ liệu, vừa xử lý trường hợp khóa không tồn tại mà không cần dùng if...else với in.

  • Nhấn mạnh lại: Thay vì kiểm tra rồi mới truy cập, get() cho phép bạn thực hiện cả hai trong một bước. Nếu khóa không tồn tại, nó sẽ tự động trả về giá trị mặc định mà bạn cung cấp, giúp mã ngắn gọn và sạch sẽ hơn.

Ví dụ nhắc lại:

thong_tin_nguoi_dung = {
    "ten": "Minh",
    "tuoi": 28
}

# Lấy email, nếu không có thì mặc định là "Không có email"
email = thong_tin_nguoi_dung.get("email", "Không có email")
print(f"Email: {email}") # Output: Email: Không có email

# Lấy tuổi, nếu không có thì mặc định là 0
tuoi = thong_tin_nguoi_dung.get("tuoi", 0)
print(f"Tuổi: {tuoi}") # Output: Tuổi: 28

Sử dụng in rất tốt khi bạn cần thực hiện các hành động khác nhau tùy thuộc vào sự tồn tại của khóa. get() với giá trị mặc định lại lý tưởng khi bạn chỉ muốn lấy một giá trị và có một giá trị dự phòng nếu khóa không có.

Đọc tất cả dữ liệu (Lặp qua Dictionary) trong Python

Khi bạn muốn xử lý hoặc hiển thị toàn bộ nội dung của một Dictionary, bạn sẽ cần lặp (iterate) qua nó. Python cung cấp nhiều cách để lặp qua các khóa, giá trị hoặc cả hai.

Lặp qua các khóa (mặc định)

Khi bạn sử dụng vòng lặp for trực tiếp trên một dictionary, Python sẽ mặc định lặp qua các khóa của nó. Sau đó, bạn có thể sử dụng khóa để truy cập giá trị tương ứng.

  • Khái niệm: Vòng lặp for trực tiếp trên dictionary sẽ trả về lần lượt từng khóa.

Cú pháp:

for key in ten_dictionary:
    # Do something with key
    # Để lấy giá trị, sử dụng ten_dictionary[key]

Ví dụ minh họa:

# Tạo một dictionary về điểm số các môn học
diem_mon_hoc = {
    "Toán": 9.0,
    "Văn": 7.5,
    "Anh": 8.5,
    "Lịch sử": 6.0
}

print("--- Lặp qua các khóa ---")
for mon_hoc in diem_mon_hoc:
    print(f"Tên môn học: {mon_hoc}")

print("\n--- Lặp qua khóa và giá trị (kết hợp) ---")
for mon_hoc in diem_mon_hoc:
    diem = diem_mon_hoc[mon_hoc] # Lấy giá trị bằng khóa
    print(f"Môn: {mon_hoc}, Điểm: {diem}")

# Output:
# --- Lặp qua các khóa ---
# Tên môn học: Toán
# Tên môn học: Văn
# Tên môn học: Anh
# Tên môn học: Lịch sử
#
# --- Lặp qua khóa và giá trị (kết hợp) ---
# Môn: Toán, Điểm: 9.0
# Môn: Văn, Điểm: 7.5
# Môn: Anh, Điểm: 8.5
# Môn: Lịch sử, Điểm: 6.0

Lặp qua các giá trị

Nếu bạn chỉ quan tâm đến các giá trị và không cần đến các khóa, bạn có thể sử dụng phương thức values() của dictionary. Phương thức này trả về một đối tượng "view" (kiểu dict_values) chứa tất cả các giá trị.

  • Khái niệm: Sử dụng phương thức values() để lấy một "view" của tất cả các giá trị trong dictionary, sau đó lặp qua view này.

  • Cú pháp: for value in ten_dictionary.values():

Ví dụ minh họa:

# Tiếp tục với dictionary 'diem_mon_hoc'
print("\n--- Lặp qua các giá trị ---")
for diem in diem_mon_hoc.values():
    print(f"Điểm số: {diem}")

# Output:
# --- Lặp qua các giá trị ---
# Điểm số: 9.0
# Điểm số: 7.5
# Điểm số: 8.5
# Điểm số: 6.0

Lặp qua cả khóa và giá trị

Đây là cách phổ biến và hiệu quả nhất khi bạn cần truy cập cả khóa và giá trị trong mỗi lần lặp. Bạn sử dụng phương thức items() của dictionary. Phương thức này trả về một đối tượng "view" (kiểu dict_items) chứa các cặp khóa-giá trị dưới dạng tuple (khóa, giá_trị). Bạn có thể "giải nén" (unpack) các tuple này trực tiếp vào hai biến trong vòng lặp for.

  • Khái niệm: Sử dụng phương thức items() để lấy một "view" của các cặp (khóa, giá_trị) dưới dạng tuple, sau đó lặp và giải nén chúng.

  • Cú pháp: for key, value in ten_dictionary.items():

  • Ưu điểm: Cách rõ ràng, ngắn gọn và hiệu quả nhất khi bạn cần cả khóa và giá trị.

Ví dụ minh họa:

# Tiếp tục với dictionary 'diem_mon_hoc'
print("\n--- Lặp qua cả khóa và giá trị (sử dụng items()) ---")
for mon_hoc, diem in diem_mon_hoc.items():
    print(f"Môn: {mon_hoc}, Điểm: {diem}")

# Output:
# --- Lặp qua cả khóa và giá trị (sử dụng items()) ---
# Môn: Toán, Điểm: 9.0
# Môn: Văn, Điểm: 7.5
# Môn: Anh, Điểm: 8.5
# Môn: Lịch sử, Điểm: 6.0

Phương thức items() là lựa chọn được khuyến nghị nhất khi bạn cần xử lý cả khóa và giá trị trong vòng lặp.

Đọc dữ liệu từ Dictionary lồng (Nested Dictionary) trong Python

Một trong những sức mạnh của Dictionary là khả năng chứa các Dictionary khác làm giá trị của nó. Điều này tạo ra một cấu trúc dữ liệu "lồng" (nested), rất hữu ích để biểu diễn các đối tượng phức tạp với nhiều cấp độ thông tin.

  • Khái niệm: Dictionary lồng là một dictionary mà một hoặc nhiều giá trị của nó lại là một dictionary khác.

  • Cách truy cập: Để đọc dữ liệu từ dictionary lồng, bạn chỉ cần nối tiếp các dấu ngoặc vuông [] hoặc các lệnh get() theo từng cấp độ lồng.

Ví dụ minh họa:

Hãy xem xét một dictionary lưu trữ thông tin về một công ty, bao gồm các phòng ban, và mỗi phòng ban lại có thông tin chi tiết riêng:

# Dictionary lồng về thông tin công ty
thong_tin_cong_ty = {
    "ten_cong_ty": "ABC Corp",
    "dia_chi": "123 Đường XYZ, TP.HCM",
    "phong_ban": { # Đây là một dictionary lồng
        "ketoan": {
            "so_luong_nhan_vien": 10,
            "truong_phong": "Nguyễn Thị E",
            "ngan_sach": 500000000
        },
        "kinh_doanh": {
            "so_luong_nhan_vien": 25,
            "truong_phong": "Trần Văn F",
            "muc_tieu_doanh_so": "1 tỷ VNĐ"
        },
        "ky_thuat": {
            "so_luong_nhan_vien": 30,
            "truong_phong": "Lê Văn G",
            "du_an_chinh": ["Dự án A", "Dự án B"]
        }
    },
    "nam_thanh_lap": 2010
}

print("--- Đọc dữ liệu từ Dictionary lồng ---")

# Truy cập thông tin cấp 1
ten_cong_ty = thong_tin_cong_ty["ten_cong_ty"]
print(f"Tên công ty: {ten_cong_ty}")

# Truy cập thông tin của một phòng ban cụ thể (cấp 2)
# Ví dụ: Lấy thông tin phòng kế toán
thong_tin_ketoan = thong_tin_cong_ty["phong_ban"]["ketoan"]
print(f"\nThông tin phòng Kế toán: {thong_tin_ketoan}")

# Truy cập một thuộc tính cụ thể trong phòng ban (cấp 3)
truong_phong_kinh_doanh = thong_tin_cong_ty["phong_ban"]["kinh_doanh"]["truong_phong"]
print(f"Trưởng phòng Kinh doanh: {truong_phong_kinh_doanh}")

# Truy cập một phần tử trong list nằm trong dictionary lồng
du_an_dau_tien_ky_thuat = thong_tin_cong_ty["phong_ban"]["ky_thuat"]["du_an_chinh"][0]
print(f"Dự án chính đầu tiên của phòng Kỹ thuật: {du_an_dau_tien_ky_thuat}")

# Sử dụng get() để truy cập an toàn hơn trong dictionary lồng
print("\n--- Sử dụng get() với Dictionary lồng ---")
# Lấy ngân sách phòng Marketing (có thể không tồn tại)
ngan_sach_marketing = thong_tin_cong_ty.get("phong_ban", {}).get("marketing", {}).get("ngan_sach", "Không có thông tin ngân sách")
print(f"Ngân sách phòng Marketing: {ngan_sach_marketing}")

# Lấy ngân sách phòng Kế toán (tồn tại)
ngan_sach_ketoan = thong_tin_cong_ty.get("phong_ban", {}).get("ketoan", {}).get("ngan_sach", "Không có thông tin ngân sách")
print(f"Ngân sách phòng Kế toán: {ngan_sach_ketoan}")

# Output:
# --- Đọc dữ liệu từ Dictionary lồng ---
# Tên công ty: ABC Corp
#
# Thông tin phòng Kế toán: {'so_luong_nhan_vien': 10, 'truong_phong': 'Nguyễn Thị E', 'ngan_sach': 500000000}
# Trưởng phòng Kinh doanh: Trần Văn F
# Dự án chính đầu tiên của phòng Kỹ thuật: Dự án A
#
# --- Sử dụng get() với Dictionary lồng ---
# Ngân sách phòng Marketing: Không có thông tin ngân sách
# Ngân sách phòng Kế toán: 500000000

Khi làm việc với dictionary lồng, việc sử dụng get() với giá trị mặc định là một thực hành tốt để tránh lỗi KeyError nếu một cấp độ nào đó của dictionary hoặc khóa không tồn tại. Bạn có thể cung cấp một dictionary rỗng {} làm giá trị mặc định cho get() ở cấp độ trung gian để có thể tiếp tục gọi get() ở cấp độ sâu hơn.

Kết bài

Chúng ta đã cùng nhau đi qua các phương pháp cơ bản và hiệu quả nhất để đọc dữ liệu từ Dictionary trong Python. Từ việc truy cập trực tiếp bằng dấu ngoặc vuông [], sử dụng phương thức get() an toàn hơn, đến việc kiểm tra sự tồn tại của khóa bằng in, và các cách lặp qua Dictionary để xử lý toàn bộ nội dung của nó. Đặc biệt, chúng ta cũng đã tìm hiểu cách "đào sâu" vào các Dictionary lồng nhau để lấy ra thông tin ở nhiều cấp độ.

Nắm vững các kỹ thuật này là chìa khóa để bạn có thể khai thác tối đa tiềm năng của Dictionary trong các dự án của mình. Dictionary không chỉ giúp bạn lưu trữ dữ liệu một cách có tổ chức mà còn cho phép bạn truy xuất thông tin một cách nhanh chóng và linh hoạt.

Hãy thực hành thường xuyên để các phương pháp này trở thành phản xạ tự nhiên khi bạn làm việc với Python. Với Dictionary trong tay, bạn sẽ có một công cụ mạnh mẽ để quản lý và thao tác với dữ liệu một cách hiệu quả, mở ra cánh cửa cho nhiều ứng dụng phức tạp và thú vị hơn trong tương lai.

Bài viết liên quan