Posted in

Sắp xếp các phần tử trong Dictionary với Python

Dictionary (từ điển) là một trong những cấu trúc dữ liệu cơ bản và cực kỳ hữu ích trong Python — lưu trữ dữ liệu theo cặp key: value, tra cứu nhanh theo key và rất thuận tiện để biểu diễn các bảng tra cứu, cấu hình, thống kê… Từ Python 3.7 trở đi, dict giữ thứ tự chèn (insertion order), nhưng việc sắp xếp theo một tiêu chí cụ thể (theo key, theo value, theo nhiều tiêu chí, hoặc theo giá trị trong dictionary lồng nhau) vẫn là nhu cầu rất thường gặp khi mình cần hiển thị dữ liệu gọn gàng, xếp hạng, lấy top N, hoặc xuất báo cáo.

Trong bài viết này, hãy cùng mình hiểu những cách sắp xếp dictionary , so sánh hiệu năng, cũng như những trường hợp áp dụng. Bắt đầu thôi nào…!!!

1. Khi nào cần sắp xếp dict

Mình tóm tắt một vài tình huống thực tế:

  • Hiển thị cho người dùng: danh bạ, bảng báo cáo tài chính, bảng thống kê — trình tự theo tên, theo mã, hoặc theo giá trị (ví dụ: doanh thu).
  • Xếp hạng / top N: ví dụ thống kê view của các trang, mình muốn top 5 trang được xem nhiều nhất.
  • So sánh / đồng bộ dữ liệu: khi cần so sánh hai nguồn, sắp xếp giúp so sánh dễ đọc.
  • Dữ liệu lồng nhau: muốn sắp xếp theo một thuộc tính trong giá trị (ví dụ: student['score']).
  • Xuất file có thứ tự cố định: CSV/JSON cần thứ tự nhất định cho người đọc.

Nếu không thuộc những trường hợp trên, việc giữ insertion order (mặc định) có thể đã đủ. Nhưng thực tế ứng dụng thường rơi vào những tình huống mình liệt kê.

2. Dictionary trong Python và đặc điểm cần lưu ý

Một số điểm cần nhớ trước khi sắp xếp:

  • dict là cấu trúc key → value; key phải là immutable (ví dụ: str, int, tuple).
  • Python 3.7+ giữ thứ tự chèn, nhưng đó không phải là “sắp xếp”; nó chỉ giữ thứ tự bạn thêm phần tử.
  • sorted() luôn trả về một danh sách (list) — thường là list các tuple (key, value). Nếu muốn dict đã sắp xếp, cần chuyển lại bằng dict() hoặc collections.OrderedDict (cho tương thích ngược).
  • Việc sắp xếp tốn O(n log n) (Timsort), nên cân nhắc trên dữ liệu lớn.

3. Các phương pháp cơ bản để sắp xếp Dictionary

Căn bản nhất là dùng sorted() trên dict.items().

Ví dụ cơ bản — sắp xếp students theo tên (mặc định sorted() trên items sẽ so sánh theo key trước):

# Example: basic sorted usage
students = {"Alice": 7, "Bob": 9, "Charlie": 8}
# Get a list of (key, value) tuples sorted by key (name)
sorted_items = sorted(students.items())
# sorted_items -> [('Alice', 7), ('Bob', 9), ('Charlie', 8)]

Giải thích: sorted(students.items()) trả về list các tuple sắp xếp theo phần tử đầu (key) nếu không cung cấp key=.

4. Sắp xếp Dictionary theo key

Có vài cách phổ biến:

  • Lấy danh sách key đã sắp xếp: sorted(dict.keys())
  • Tạo dict mới theo thứ tự key: dict(sorted(d.items())) hoặc dict comprehension.

Ví dụ: sắp xếp danh bạ theo tên (key):

# Sort dict by keys and convert back to dict
phonebook = {"Nam": "0123", "An": "0456", "Binh": "0789"}
# Create a new dict with items sorted by key
sorted_phonebook = dict(sorted(phonebook.items()))
# sorted_phonebook -> {'An': '0456', 'Binh': '0789', 'Nam': '0123'}

Lưu ý: nếu muốn case-insensitive (không phân biệt hoa/thường), dùng key=str.lower khi sắp xếp keys:

# Case-insensitive key sort<br>names = {"ann": 1, "Bob": 2, "alice": 3}<br>sorted_by_case_insensitive = dict(sorted(names.items(), key=lambda x: x[0].lower()))

5. Sắp xếp Dictionary theo value

Khi cần xếp theo giá trị (value), ta thường dùng key=lambda x: x[1].

Ví dụ: sắp xếp sản phẩm theo giá tăng dần:

# Sort dict by values (product price)
products = {"apple": 3.5, "banana": 1.2, "cherry": 4.0}
# Sorted list of tuples by value (price)
sorted_by_price = sorted(products.items(), key=lambda item: item[1])
# Convert back to dict if needed
sorted_products = dict(sorted_by_price)

Để sắp xếp giảm dần (price từ cao xuống thấp) dùng reverse=True:

# Descending order
sorted_desc = dict(sorted(products.items(), key=lambda item: item[1], reverse=True))

Lấy top N giá trị:

# Get top 2 products by price
top2 = sorted(products.items(), key=lambda i: i[1], reverse=True)[:2]
# top2 is a list of tuples

Giải thích: item[1] chính là giá trị của mỗi cặp (key, value).

6. Sử dụng operator.itemgetter và so sánh với lambda

operator.itemgetter thường ngắn gọn và có thể nhanh hơn lambda chút ít:

from operator import itemgetter

# Use itemgetter to sort by value (index 1)
sorted_products = dict(sorted(products.items(), key=itemgetter(1)))

So sánh:

  • lambda rất rõ ràng và linh hoạt (có thể xử lý logic phức tạp).
  • itemgetter ngắn gọn và đôi khi có hiệu năng tốt hơn cho trường hợp truy cập chỉ mục đơn giản.

7. Sắp xếp nhiều tiêu chí (multi-criteria)

Khi nhiều phần tử có cùng value, bạn có thể sắp xếp tiếp theo key hoặc theo tiêu chí phụ bằng tuple trong key.

Ví dụ: sắp xếp sản phẩm theo giá tăng dần, nếu giá bằng thì theo tên:

products = {"apple": 3.5, "apricot": 3.5, "banana": 1.2}
# Sort by (price, name)
sorted_multi = dict(sorted(products.items(), key=lambda item: (item[1], item[0])))
# Result: banana (1.2), apple (3.5), apricot (3.5 but 'apple' < 'apricot')

Giải thích: key=lambda item: (item[1], item[0]) tạo tuple (price, name) để sắp xếp theo thứ tự ưu tiên.

8. Giữ nguyên Dictionary sau khi sắp xếp

sorted() trả về list, nên nếu bạn cần dict đã sắp xếp, có các cách:

  • Dùng dict(sorted(...)) — trên Python 3.7+ dict sẽ giữ thứ tự insertion.
  • Dùng collections.OrderedDict nếu cần tương thích Python cũ hơn hoặc muốn biểu đạt rõ ràng.

Ví dụ với OrderedDict:

from collections import OrderedDict

sorted_items = sorted(products.items(), key=lambda x: x[1])
ordered = OrderedDict(sorted_items)

Lưu ý: OrderedDict cung cấp thêm một vài phương thức đặc trưng (ví dụ move_to_end) nhưng với Python hiện đại, dict thường đã đủ cho nhiều tình huống.

9. Sắp xếp Dictionary lồng nhau (Nested Dictionary)

Khi value là một dict khác, ta trỏ vào thuộc tính bên trong:

Ví dụ: dữ liệu sinh viên:

students = {
    "s1": {"name": "An", "score": 8, "age": 20},
    "s2": {"name": "Binh", "score": 8, "age": 19},
    "s3": {"name": "Nam", "score": 7, "age": 21}
}
# Sort by score descending, then by age ascending
sorted_students = dict(sorted(
    students.items(),
    key=lambda item: (-item[1]['score'], item[1]['age'])
))

Giải thích chi tiết:

  • item là tuple (student_id, student_dict).
  • -item[1]['score'] sắp xếp score giảm dần (dùng dấu âm).
  • item[1]['age'] là tiêu chí phụ: nếu điểm bằng thì học sinh trẻ hơn lên trên.

Lưu ý: cần kiểm tra tồn tại khóa trước khi truy cập để tránh KeyError nếu dữ liệu không đồng đều.

10. So sánh hiệu năng và lưu ý khi dữ liệu lớn

Một vài lưu ý hiệu năng:

  • sorted() (Timsort) là O(n log n). Với dataset vài triệu phần tử, sắp xếp toàn bộ có thể tốn tài nguyên.
  • Nếu chỉ cần top N, dùng heapq.nlargest() hoặc heapq.nsmallest() để tốt hơn về mặt bộ nhớ/hiệu năng:
import heapq
# Get top 3 products by price
top3 = heapq.nlargest(3, products.items(), key=lambda x: x[1])
  • Tránh sắp xếp nhiều lần trong vòng lặp — nếu cần nhiều dạng sắp xếp, cân nhắc lưu kết quả trung gian.
  • Nếu dữ liệu rất lớn và phức tạp, cân nhắc dùng Pandas, cơ sở dữ liệu (SQL) hoặc công cụ phân tích dữ liệu khác để xử lý trước khi load vào Python.

11. Kết luận

Qua bài viết này, mình đã cùng bạn đi từ những kỹ thuật sắp xếp cơ bản cho dict trong Python cho đến các tình huống nâng cao như sắp xếp nhiều tiêu chí hay xử lý dictionary lồng nhau. Có thể thấy rằng, việc lựa chọn phương pháp phù hợp phụ thuộc rất nhiều vào mục đích thực tế: đôi khi chỉ cần sắp xếp theo key để hiển thị gọn gàng, nhưng cũng có lúc phải xếp hạng theo value hoặc tìm top N phần tử cho báo cáo.

Điều quan trọng là bạn hiểu rõ công cụ mình có: từ sorted() với lambda/itemgetter, đến OrderedDict, hay thậm chí heapq khi dữ liệu quá lớn. Nắm vững những cách này sẽ giúp bạn linh hoạt hơn trong việc xử lý dữ liệu, đồng thời viết code rõ ràng, dễ bảo trì.

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

  1. Python Software Foundation. (n.d.). Built-in Functions — sorted(). In Python Documentation. Retrieved September 30, 2025, from https://docs.python.org/3/library/functions.html#sorted
  2. Python Software Foundation. (n.d.). Data Structures — Dictionaries. In Python Tutorial. Retrieved September 30, 2025, from https://docs.python.org/3/tutorial/datastructures.html
  3. Python Software Foundation. (n.d.). Sorting HOW TO. Retrieved September 30, 2025, from https://docs.python.org/3/howto/sorting.html
  4. Hetland, M. L. (2017). Beginning Python: From Novice to Professional (4th ed.). Apress.

Leave a Reply

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