How to sort a list by a key in Python

· 2 min read · Updated March 16, 2026 · beginner
python lists sorting

Use the key parameter to define custom sorting logic. Both sorted() and list.sort() support it.

Basic: sort by string length

words = ["apple", "pie", "banana", "cat"]
sorted_words = sorted(words, key=len)
print(sorted_words)  # ['pie', 'cat', 'apple', 'banana']

key=len tells Python to use each string’s length for comparison.

Sort a list of dictionaries

users = [
    {"name": "Alice", "age": 30},
    {"name": "Bob", "age": 25},
    {"name": "Carol", "age": 35}
]

sorted_users = sorted(users, key=lambda x: x["age"])

The lambda extracts the value to sort by.

Sort in descending order

Add reverse=True:

numbers = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_desc = sorted(numbers, reverse=True)
print(sorted_desc)  # [9, 6, 5, 4, 3, 2, 1, 1]

Using itemgetter for better performance

For large datasets or frequent sorts, operator.itemgetter is faster than lambdas:

from operator import itemgetter

users = [
    {"name": "Alice", "age": 30},
    {"name": "Bob", "age": 25}
]

sorted_users = sorted(users, key=itemgetter("age"))

Sort by multiple keys

Chain the keys:

data = [
    {"name": "Alice", "dept": "sales"},
    {"name": "Bob", "dept": "engineering"},
    {"name": "Carol", "dept": "sales"}
]

sorted_data = sorted(data, key=lambda x: (x["dept"], x["name"]))

In-place sort with .sort()

Modify the original list without creating a new one:

numbers = [3, 1, 4, 1, 5]
numbers.sort(key=lambda x: -x)  # Now [5, 4, 3, 1, 1]

Common mistake

Forgetting that .sort() returns None:

# Wrong - this assigns None to numbers
numbers = [3, 1, 4]
numbers = numbers.sort(key=len)  # numbers is now None

# Correct - use .sort() for in-place, sorted() for new list
numbers.sort(key=len)  # modifies numbers in place

See Also