Trong thực tế, khi làm việc với danh sách các đối tượng trong Python (ví dụ: danh sách nhân viên, sản phẩm, hoặc thiết bị...), bạn thường cần sắp xếp chúng theo nhiều tiêu chí cùng lúc. Ví dụ:

  • Sắp xếp theo điểm tăng dần, sau đó theo tên giảm dần.

  • Sắp xếp theo ngày gần nhất, sau đó theo trạng thái ưu tiên.

May mắn là Python cung cấp một giải pháp rất gọn gàng: truyền một tuple vào key trong phương thức .sort() hoặc hàm sorted().

💡 Tại sao dùng tuple?

Trong Python, tuple có thể so sánh trực tiếp (nhờ các phương thức như __lt__, __gt__, ...) theo thứ tự từng phần tử từ trái sang phải. Điều này giúp bạn kết hợp nhiều tiêu chí sắp xếp trong một dòng code duy nhất.




🧪 Ví dụ thực tế: Danh sách công cụ (Tools)

python
class Tool: def __init__(self, name, weight): self.name = name self.weight = weight def __repr__(self): return f'Tool({self.name!r}, {self.weight})' power_tools = [ Tool('an', 4), Tool('minh', 5), Tool('linh', 40), Tool('binh', 4), ]

1️⃣ Sắp xếp theo trọng lượng tăng dần, rồi theo tên tăng dần

python
power_tools.sort(key=lambda x: (x.weight, x.name)) print(power_tools)

👉 Kết quả:

css
[Tool('an', 4), Tool('binh', 4), Tool('minh', 5), Tool('linh', 40)]
  • anbinh có cùng trọng lượng → sắp xếp tiếp theo tên.

  • minhlinh có trọng lượng khác nhau → theo weight trước.


2️⃣ Sắp xếp tất cả theo trọng lượng và tên giảm dần

python
power_tools.sort(key=lambda x: (x.weight, x.name), reverse=True) print(power_tools)

👉 Kết quả:

css
[Tool('linh', 40), Tool('minh', 5), Tool('binh', 4), Tool('an', 4)]
  • Mọi tiêu chí đều bị đảo chiều: weight giảm, name giảm.


3️⃣ Sắp xếp theo trọng lượng giảm dần, sau đó tên tăng dần

python
power_tools.sort(key=lambda x: (-x.weight, x.name)) print(power_tools)

👉 Kết quả:

css
[Tool('linh', 40), Tool('minh', 5), Tool('an', 4), Tool('binh', 4)]

✅ Đây là kỹ thuật phổ biến: Dùng -x.weight để đảo chiều chỉ tiêu số, tên giữ nguyên thứ tự tăng.


4️⃣ Sắp xếp theo tên tăng dần

python
power_tools.sort(key=lambda x: x.name) print(power_tools)

👉 Kết quả:

css
[Tool('an', 4), Tool('binh', 4), Tool('linh', 40), Tool('minh', 5)]

5️⃣ Sắp xếp theo trọng lượng giảm dần

python
power_tools.sort(key=lambda x: x.weight, reverse=True) print(power_tools)

👉 Kết quả:

css
[Tool('linh', 40), Tool('minh', 5), Tool('an', 4), Tool('binh', 4)]

✅ Tổng kết

Cách sắp xếpCách viết key
Trọng lượng tăng → Tên tăngkey=lambda x: (x.weight, x.name)
Trọng lượng giảm → Tên tăngkey=lambda x: (-x.weight, x.name)
Trọng lượng và tên cùng giảmkey=lambda x: (x.weight, x.name), reverse=True
Tên tăng dầnkey=lambda x: x.name
Trọng lượng giảm dầnkey=lambda x: x.weight, reverse=True

📌 Lưu ý nâng cao

  • Với các kiểu dữ liệu không hỗ trợ - (như str), bạn không thể đảo chiều bằng cách -x.name. Khi đó, hãy sử dụng 2 lần .sort(), vì .sort() trong Python là ổn định (stable sort):

python
power_tools.sort(key=lambda x: x.name) # Tên tăng dần power_tools.sort(key=lambda x: x.weight, reverse=True) # Trọng lượng giảm dần

Kỹ thuật này giúp bạn trộn nhiều tiêu chí với thứ tự khác nhau một cách chính xác.


📚 Tham khảo