5 Best Ways to Python Sort List of Dicts by Key Value

πŸ’‘ Problem Formulation: When working with lists of dictionaries in Python, a common challenge arises when you need to sort them by a specific key’s value. For example, you might have a list of dictionaries representing employees, each with attributes like “name”, “age”, and “department”, and you want to sort this list by the “age” key. Desired output is a list sorted based on the corresponding key value in all dictionaries.

Method 1: Using the sorted() Function and a Lambda Expression

The sorted() function in Python returns a new sorted list from the items in an iterable. Coupling this function with a lambda expression allows you to sort a list of dictionaries by a specific key. The lambda function serves as a small anonymous function that is used as the key argument for sorted().

Here’s an example:

employees = [
    {'name': 'Alice', 'age': 30},
    {'name': 'Bob', 'age': 25},
    {'name': 'Charlie', 'age': 35}
]

sorted_employees = sorted(employees, key=lambda x: x['age'])
print(sorted_employees)

Output:

[
    {'name': 'Bob', 'age': 25},
    {'name': 'Alice', 'age': 30},
    {'name': 'Charlie', 'age': 35}
]

This code snippet sorts the list of dictionaries employees by the ‘age’ key using a lambda function to extract the age from each dictionary within the list as the sorting key.

Method 2: Using the sort() Method of Lists

The sort() method modifies the list in-place and sorts the elements. Specifying the key parameter with a lambda function will allow you to sort a list of dictionaries based on a specific key’s value, affecting the original list directly.

Here’s an example:

employees = [
    {'name': 'Alice', 'age': 30},
    {'name': 'Bob', 'age': 25},
    {'name': 'Charlie', 'age': 35}
]

employees.sort(key=lambda x: x['age'])
print(employees)

Output:

[
    {'name': 'Bob', 'age': 25},
    {'name': 'Alice', 'age': 30},
    {'name': 'Charlie', 'age': 35}
]

By calling employees.sort(key=lambda x: x['age']), we sort the original list of employees based on the age key, modifying the original list directly.

Method 3: Sorting by Multiple Keys

To sort a list of dictionaries by multiple keys, you can pass a tuple to the key parameter of the sorted() or sort() method. Each element within the tuple represents a different key in the dictionaries. The list is sorted by the first key, then by the second, and so on.

Here’s an example:

employees = [
    {'name': 'Dave', 'age': 25, 'department': 'Sales'},
    {'name': 'Alice', 'age': 30, 'department': 'IT'},
    {'name': 'Alice', 'age': 30, 'department': 'HR'}
]

sorted_employees = sorted(employees, key=lambda x: (x['name'], x['department']))
print(sorted_employees)

Output:

[
    {'name': 'Alice', 'age': 30, 'department': 'HR'},
    {'name': 'Alice', 'age': 30, 'department': 'IT'},
    {'name': 'Dave', 'age': 25, 'department': 'Sales'}
]

This example sorts employees first by the ‘name’ key, and then within those with the same name, it sorts by the ‘department’ key.

Method 4: Using the itemgetter() Function

The itemgetter() function from the operator module creates a callable that serves as the key function for sorting. It’s more efficient and faster than a lambda expression when dealing with large datasets.

Here’s an example:

from operator import itemgetter

employees = [
    {'name': 'Alice', 'age': 30},
    {'name': 'Bob', 'age': 25},
    {'name': 'Charlie', 'age': 35}
]

sorted_employees = sorted(employees, key=itemgetter('age'))
print(sorted_employees)

Output:

[
    {'name': 'Bob', 'age': 25},
    {'name': 'Alice', 'age': 30},
    {'name': 'Charlie', 'age': 35}
]

Here, itemgetter('age') efficiently retrieves the ‘age’ key value from each dictionary for sorting the employees list.

Bonus One-Liner Method 5: Using List Comprehensions

Python list comprehensions can be used to create a new list of tuples, where each tuple consists of the sorting key and the original dictionary. Sorting the list of tuples directly and extracting the dictionaries can be a concise one-liner method.

Here’s an example:

employees = [
    {'name': 'Alice', 'age': 30},
    {'name': 'Bob', 'age': 25},
    {'name': 'Charlie', 'age': 35}
]

sorted_employees = [x for _, x in sorted((d['age'], d) for d in employees)]
print(sorted_employees)

Output:

[
    {'name': 'Bob', 'age': 25},
    {'name': 'Alice', 'age': 30},
    {'name': 'Charlie', 'age': 35}
]

The list comprehension creates tuples of (age, dictionary) which are sorted, and then it constructs a new list with the dictionaries in the sorted order.

Summary/Discussion

  • Method 1: Using the sorted() Function and a Lambda Expression. Simple, readable. Creates a new list. Good for smaller datasets.
  • Method 2: Using the sort() Method of Lists. In-place sorting. Affects the original list. Avoids creating a new list which can be memory efficient.
  • Method 3: Sorting by Multiple Keys. Flexible, allowing multiple criteria. Can quickly become complex with many sorting keys.
  • Method 4: Using the itemgetter() Function. Fast, efficient. Recommended for larger datasets. Requires importing the operator module.
  • Bonus One-Liner Method 5: Using List Comprehensions. Concise, but less readable. Good for simple, one-off sorts.