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)
1️⃣ Sắp xếp theo trọng lượng tăng dần, rồi theo tên tăng dần
👉 Kết quả:
-
an
vàbinh
có cùng trọng lượng → sắp xếp tiếp theo tên. -
minh
vàlinh
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
👉 Kết quả:
-
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
👉 Kết quả:
✅ Đâ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
👉 Kết quả:
5️⃣ Sắp xếp theo trọng lượng giảm dần
👉 Kết quả:
✅ Tổng kết
Cách sắp xếp | Cách viết key |
---|---|
Trọng lượng tăng → Tên tăng | key=lambda x: (x.weight, x.name) |
Trọng lượng giảm → Tên tăng | key=lambda x: (-x.weight, x.name) |
Trọng lượng và tên cùng giảm | key=lambda x: (x.weight, x.name), reverse=True |
Tên tăng dần | key=lambda x: x.name |
Trọng lượng giảm dần | key=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):
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
-
Sách Effective Python - Item 14: Sort by Complex Criteria Using the key Parameter