Sắp xếp list chứa dict theo giá trị của một key cụ thể. Dùng sorted() với key parameter.
Dữ liệu mẫu
employees = [
{"name": "John", "salary": 10000},
{"name": "Emma", "salary": 30000},
{"name": "Harry", "salary": 15000},
{"name": "Aslan", "salary": 10000}
]
Cách 1: Lambda function (Phổ biến)
# Tăng dần theo salary sorted_emp = sorted(employees, key=lambda item: item['salary']) print(sorted_emp) # Giảm dần sorted_desc = sorted(employees, key=lambda item: item['salary'], reverse=True) print(sorted_desc)
Kết quả
[{'name': 'John', 'salary': 10000}, {'name': 'Aslan', 'salary': 10000}, {'name': 'Harry', 'salary': 15000}, {'name': 'Emma', 'salary': 30000}]
[{'name': 'Emma', 'salary': 30000}, {'name': 'Harry', 'salary': 15000}, {'name': 'John', 'salary': 10000}, {'name': 'Aslan', 'salary': 10000}]
Cách 2: operator.itemgetter (Nhanh hơn lambda)
from operator import itemgetter
sorted_emp = sorted(employees, key=itemgetter('salary'))
# itemgetter('salary') ≈ lambda x: x['salary'] nhưng tối ưu C-level
Cách 3: Sắp xếp đa tiêu chí (Multi-key)
# Sắp xếp: salary tăng, nếu bằng thì name tăng
sorted_multi = sorted(employees, key=lambda x: (x['salary'], x['name']))
print(sorted_multi)
# Hoặc dùng itemgetter đa key
from operator import itemgetter
sorted_multi2 = sorted(employees, key=itemgetter('salary', 'name'))
So sánh hiệu năng
| Phương pháp | Tốc độ | Độ đọc | Linh hoạt |
|---|---|---|---|
| lambda | Trung bình | Tốt | Cao (logic tùy ý) |
| itemgetter | Nhanh hơn (C-level) | Tốt | Chỉ get item |
| tuple key (lambda) | Trung bình | Tốt | Multi-key dễ dàng |
Kết luận
Dùng sorted(list, key=lambda x: x['key']) cho đơn giản. itemgetter cho hiệu năng. Tuple key cho multi-criteria sort.