Posted in

Giới thiệu Dictionary và cách truy cập phần tử trong Python

Trong quá trình học Python, mình nhận ra có một kiểu dữ liệu cực kỳ hữu ích mà hầu như dự án nào cũng cần đến, đó là Dictionary. Nếu như list giúp mình lưu trữ theo chỉ số, thì dictionary cho phép mình lưu thông tin dưới dạng cặp key–value rất tiện để tra cứu.

Bài viết này mình muốn chia sẻ lại những gì mình đã tìm hiểu về dictionary: từ khái niệm cơ bản, cách tạo, cho đến các phương pháp truy cập phần tử sao cho an toàn và hiệu quả. Mình sẽ kèm theo nhiều ví dụ thực tế để bạn dễ hình dung, vì vậy nếu bạn đang làm quen với Python hoặc muốn hệ thống lại kiến thức, thì bài này chắc chắn sẽ hữu ích.

1. Dictionary trong Python là gì?

Dictionary (viết tắt là dict) là cấu trúc dữ liệu lưu dữ liệu theo cặp key–value. Mỗi phần tử trong dictionary gồm một key (khóa) và một value (giá trị). Khác với list hay tuple dùng chỉ số số nguyên (index) để truy cập, dictionary cho phép truy xuất trực tiếp bằng key — điều này rất hữu dụng khi bạn muốn ánh xạ (map) một giá trị với một khoá có ý nghĩa.

Đặc điểm chính:

  • Key phải là kiểu bất biến (immutable): string, number, tuple (với nội dung immutable)…
  • Value có thể là bất kỳ kiểu dữ liệu nào (list, dict khác, object…).
  • Dictionary là mutable: bạn có thể thêm, sửa, xóa phần tử.
  • Thứ tự (order): từ Python 3.7, dict giữ thứ tự chèn nhưng bạn không nên dựa hoàn toàn vào thứ tự cho logic tra cứu — dict chủ yếu dùng cho ánh xạ nhanh.

2. Cách tạo Dictionary

Python cung cấp nhiều cách tạo dict. Dưới đây là các cách phổ biến kèm ví dụ.

2.1. Tạo bằng literal {}

# create dict using literal
user_profile = {"id": 101, "name": "Alice", "email": "alice@example.com"}
# print the whole dict
print(user_profile)

Giải thích:

  • user_profile là một dict chứa 3 cặp key–value.
  • print(user_profile) sẽ hiển thị toàn bộ nội dung dict.

2.2. Tạo dict rỗng rồi thêm từng phần tử

# start with empty dict and add items
config = {}
config["host"] = "localhost"  # add key 'host'
config["port"] = 8080         # add key 'port'
print(config)

Giải thích:

  • Khởi tạo config = {}.
  • Gán config["host"] = "localhost" thêm cặp mới vào dict.

2.3. Tạo bằng hàm dict()

# create dict using dict() constructor
settings = dict(mode="production", debug=False)
print(settings)  # {'mode': 'production', 'debug': False}

Giải thích:

  • dict() nhận các cặp key=value khi key là string hợp lệ (identifier).

2.4. Dict comprehension

# dict comprehension example: squares
squares = {i: i * i for i in range(1, 6)}
print(squares)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

Giải thích:

  • Tạo dictionary động theo biểu thức — rất tiện khi biến đổi từ iterable.

3. Đặc điểm của key và value

Key

  • Phải immutable: string, number, tuple (nếu tuple chỉ chứa các phần tử immutable).
  • Không được trùng: nếu gán lại key đã tồn tại, giá trị cũ sẽ bị ghi đè.

Ví dụ minh hoạ về key hợp lệ và không hợp lệ:

# valid key: tuple
coords = {(10, 20): "point A"}
print(coords[(10, 20)])  # 'point A'

# invalid key: list (this will raise TypeError if executed)
# bad_dict = {[1, 2]: "list as key"}  # TypeError: unhashable type: 'list'

Giải thích:

  • Tuple (10, 20) là immutable → có thể dùng làm key.
  • List [1, 2] mutable → không thể dùng làm key (sẽ gây TypeError).

Value

  • Có thể là bất kỳ kiểu dữ liệu nào: số, chuỗi, list, dict khác, object, v.v.

4. Cách truy cập phần tử trong Dictionary

Đây là phần quan trọng: có nhiều cách truy cập, mỗi cách có ưu/nhược.

4.1. Truy cập trực tiếp bằng dict[key]

# direct indexing
user = {"id": 10, "name": "Bob"}
print(user["name"])  # 'Bob'

Giải thích:

  • user["name"] trả về giá trị tương ứng key "name".
  • Lưu ý: nếu key không tồn tại, Python sẽ raise KeyError.

Ví dụ lỗi:

# will raise KeyError if 'age' not in dict
# print(user["age"])  # KeyError: 'age'

4.2. Truy cập an toàn bằng dict.get(key[, default])

# using get to avoid KeyError
age = user.get("age")                 # returns None if not present
age_with_default = user.get("age", 0) # returns 0 if 'age' missing
print(age, age_with_default)

Giải thích:

  • get trả về None nếu key không tồn tại (hoặc giá trị default bạn cung cấp). Rất hữu ích khi muốn tránh exception.

5. Các phương thức truy cập nâng cao

.keys(), .values(), .items()

person = {"id": 5, "name": "Cao", "roles": ["user", "editor"]}

# keys view
for k in person.keys():
    print(k)

# values view
for v in person.values():
    print(v)

# items view: (key, value) tuples
for k, v in person.items():
    print(k, "->", v)

Giải thích chi tiết:

  • .keys() trả về view của các key; có thể duyệt hoặc chuyển sang list: list(person.keys()).
  • .values() trả về view các giá trị.
  • .items() trả về view các cặp (key, value) — rất tiện khi muốn unpack trong vòng lặp.

Duyệt dictionary

  • Duyệt trực tiếp for key in dict: tương đương for key in dict.keys().
  • Dùng for key, value in dict.items() để lấy cùng lúc key và value.

6. Xử lý khi key không tồn tại

Trong thực tế, key có thể không tồn tại — ta có nhiều kỹ thuật xử lý.

6.1. Kiểm tra bằng in

if "email" in user:
    print(user["email"])
else:
    print("Email not provided")

Giải thích:

  • in kiểm tra presence của key, trả về True/False.

6.2. Dùng get(key, default)

Đã trình bày ở trên — rất tiện khi muốn trả về giá trị mặc định.

6.3. Dùng setdefault(key, default)

# setdefault will insert the key with default if missing
prefs = {}
lang = prefs.setdefault("language", "en")
print(lang)   # 'en'
print(prefs)  # {'language': 'en'}

Giải thích:

  • setdefault vừa trả về value hiện tại (nếu có), vừa chèn key với default nếu key chưa tồn tại.

6.4. Try/except (khi cần xử lý exception)

try:
    value = user["age"]
except KeyError:
    value = None

Giải thích:

  • Thích hợp khi bạn mong đợi lỗi có thể xảy ra và muốn xử lý riêng.

7. Các tình huống thực tế khi truy cập Dictionary

Mình thường dùng dict trong các trường hợp:

7.1. Thông tin người dùng (user profile)

# Received profile from database or API
profile = {"id": 300, "username": "linh", "email": "linh@example.com"}
username = profile.get("username")  # safe access

Giải thích:

  • Khi dữ liệu có thể thiếu trường (missing fields), get tránh crash.

7.2. Cấu hình hệ thống

config = {"host": "127.0.0.1", "port": 8000}
host = config["host"]
port = config.get("port", 80)  # default to 80 if missing

7.3. Xử lý JSON từ API

import json

json_str = '{"id": 200, "username": "bob", "roles": ["admin", "user"]}'
data = json.loads(json_str)         # parse JSON string to dict
user_id = data.get("id")            # safe retrieval
print(user_id)                      # 200

Giải thích:

  • json.loads chuyển JSON thành dict → truy cập tương tự dict thường.

8. Hiệu suất khi truy cập Dictionary

Một điểm mạnh lớn của dict là thời gian truy xuất trung bình O(1) (constant time) nhờ triển khai bằng bảng băm (hash table). Điều này có nghĩa là tra cứu bằng key rất nhanh, không bị ảnh hưởng nhiều bởi kích thước dict (trong trường hợp trung bình).

So sánh: tìm phần tử trong list (search by value) là O(n) — phải dò từng phần tử → chậm hơn nhiều khi dữ liệu lớn.

Lưu ý: O(1) là trung bình; trong trường hợp xấu (collisions nhiều) thời gian có thể tăng, nhưng Python xử lý băm tốt để giảm rủi ro này.

9. Khi nào nên sử dụng Dictionary?

Sử dụng dict khi:

  • Bạn cần ánh xạ (map) từ một khóa có ý nghĩa (username, id, config key) đến giá trị.
  • Cần tra cứu nhanh theo key.
  • Dữ liệu không cần thứ tự hoặc thứ tự không quan trọng (mặc dù Python 3.7+ giữ order chèn).

Tránh dùng dict khi:

  • Cần lưu thứ tự sắp xếp dựa trên index (dùng list/tuple).
  • Số lượng key rất lớn mà bạn cần tối ưu bộ nhớ—hãy cân nhắc cấu trúc khác hoặc database.

10. Kết luận

Sau khi cùng nhau đi qua từ khái niệm đến cách sử dụng, có thể thấy dictionary thật sự là một công cụ mạnh mẽ trong Python. Nó cho phép mình lưu trữ dữ liệu theo cặp key–value, truy cập nhanh chóng và linh hoạt hơn hẳn so với việc chỉ dùng list hoặc tuple.

Khi làm việc với dictionary, mình thường cân nhắc: nếu chắc chắn key tồn tại thì dùng dict[key], còn trong tình huống chưa chắc thì dùng get() để an toàn hơn. Ngoài ra, những phương thức như .keys(), .values(), .items() hay setdefault() cũng rất hữu ích trong thực tế, đặc biệt khi xử lý dữ liệu từ file JSON hoặc từ API.

Nắm vững dictionary sẽ giúp bạn lập trình Python hiệu quả hơn rất nhiều, bởi đây gần như là cấu trúc dữ liệu “xương sống” trong rất nhiều ứng dụng. Nếu bạn đã quen với phần truy cập, bước tiếp theo có thể thử tìm hiểu cách cập nhật và xóa phần tử trong dictionary để làm chủ kiểu dữ liệu này một cách toàn diện hơn.

11. Tài liệu tham khảo

  1. Python Software Foundation. (n.d.). The Python Tutorial — Data Structures (Dictionaries). Python.org. Retrieved from https://docs.python.org/3/tutorial/datastructures.html
  2. Sweigart, A. (2015). Automate the Boring Stuff with Python (1st ed.). No Starch Press.
  3. Lutz, M. (2013). Learning Python (5th ed.). O’Reilly Media.

Leave a Reply

Your email address will not be published. Required fields are marked *