PYTHON
Sorting a List of Dictionaries by Multiple Keys
Discover how to sort a list of dictionaries in Python by one or more keys, using `itemgetter` for performance or `lambda` for flexibility.
from operator import itemgetter
users = [
{'name': 'Alice', 'age': 30, 'city': 'New York'},
{'name': 'Bob', 'age': 25, 'city': 'Los Angeles'},
{'name': 'Charlie', 'age': 30, 'city': 'Chicago'},
{'name': 'David', 'age': 25, 'city': 'New York'}
]
print("Original users:")
for user in users:
print(user)
# Sort by 'age' (ascending)
sorted_by_age = sorted(users, key=itemgetter('age'))
print("
Sorted by age:")
for user in sorted_by_age:
print(user)
# Sort by 'age' (descending)
sorted_by_age_desc = sorted(users, key=itemgetter('age'), reverse=True)
print("
Sorted by age (descending):")
for user in sorted_by_age_desc:
print(user)
# Sort by 'age' (ascending) then by 'name' (ascending)
sorted_by_age_and_name = sorted(users, key=itemgetter('age', 'name'))
print("
Sorted by age then name:")
for user in sorted_by_age_and_name:
print(user)
# Sort by 'city' (ascending) then 'age' (descending) - requires lambda for mixed order
# For mixed order, sorting twice is often clearer and sometimes more performant for complex keys
# First sort by secondary key in desired order
temp_sorted = sorted(users, key=itemgetter('age'), reverse=True)
# Then sort by primary key, preserving secondary order for ties
final_sorted = sorted(temp_sorted, key=itemgetter('city'))
print("
Sorted by city (asc) then age (desc):")
for user in final_sorted:
print(user)
# Alternatively with a lambda (less efficient for simple key access, but more flexible for complex keys)
sorted_with_lambda = sorted(users, key=lambda x: (x['city'], -x['age'])) # Negative age for descending
print("
Sorted by city (asc) then age (desc) with lambda:")
for user in sorted_with_lambda:
print(user)
How it works: Sorting a list of dictionaries is a common task. Python's `sorted()` function (or list's `sort()` method) accepts a `key` argument, which is a function that extracts a comparison key from each element. `operator.itemgetter` is highly efficient for accessing dictionary keys (or tuple indices). For sorting by multiple keys, you can pass multiple key names to `itemgetter` to create a tuple for comparison. For more complex sorting logic or mixed ascending/descending orders, a `lambda` function provides greater flexibility.