Sử dụng sorted() với key=lambda để sắp xếp danh sách dictionary theo một hoặc nhiều khóa.
Dữ liệu mẫu
my_list = [
{"name": "Adwaita", "roll": 100},
{"name": "Aadrika", "roll": 234},
{"name": "Sakya", "roll": 23}
]
Các trường hợp sắp xếp
# 1. Theo roll tăng dần
print(sorted(my_list, key=lambda i: i['roll']))
# [{'name': 'Sakya', 'roll': 23}, {'name': 'Adwaita', 'roll': 100}, {'name': 'Aadrika', 'roll': 234}]
# 2. Theo roll rồi name (tie-breaker)
print(sorted(my_list, key=lambda i: (i['roll'], i['name'])))
# 3. Theo roll giảm dần
print(sorted(my_list, key=lambda i: i['roll'], reverse=True))
# [{'name': 'Aadrika', 'roll': 234}, {'name': 'Adwaita', 'roll': 100}, {'name': 'Sakya', 'roll': 23}]
# 4. Theo name alphabet
print(sorted(my_list, key=lambda i: i['name']))
# [{'name': 'Aadrika', 'roll': 234}, {'name': 'Adwaita', 'roll': 100}, {'name': 'Sakya', 'roll': 23}]
Sắp xếp tại chỗ (in-place)
my_list.sort(key=lambda i: i['roll']) # thay đổi my_list gốc
Sắp xếp phức tạp: nhiều tiêu chí, hướng khác nhau
# roll tăng, name giảm
from operator import itemgetter
my_list.sort(key=lambda x: (x['roll'], -ord(x['name'][0]))) # phức tạp
# Dễ hơn: dùng tuple với reverse cho từng cấp (Python 3.8+)
# Hoặc sorted 2 lần (stable sort):
my_list.sort(key=lambda x: x['name']) # sort phụ trước
my_list.sort(key=lambda x: x['roll']) # sort chính sau
Performance
sorted(): O(n log n), tạo list mới.list.sort(): O(n log n), in-place, tiết kiệm bộ nhớ.- Dùng
operator.itemgetter('roll')nhanh hơn lambda nhẹ.