Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Sắp xếp list of dictionaries theo giá trị trong Python

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ẹ.