5 Best Ways to Sort List of Dictionaries by Values in Python Using itemgetter

Rate this post

πŸ’‘ Problem Formulation: You have a list of dictionaries and you want to sort this list based on the values of a specific key. For example, if you have a list of employee records where each record is a dictionary containing the employee’s name and their salary, you want to sort this list by the salary value in ascending or descending order. The sorted list should maintain the structure, only reordering elements based on the sorting criteria.

Method 1: Basic Sorting with itemgetter

This method provides a straightforward approach to sort a list of dictionaries by using the itemgetter function from the operator module. itemgetter creates a callable that fetches the value from a dictionary for a specific key, which can then be passed to the sorted function as the key argument.

Here’s an example:

from operator import itemgetter

employees = [
    {'name': 'Alice', 'salary': 90000},
    {'name': 'Bob', 'salary': 50000},
    {'name': 'Diana', 'salary': 120000}
]

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

Output:

[
    {'name': 'Bob', 'salary': 50000},
    {'name': 'Alice', 'salary': 90000},
    {'name': 'Diana', 'salary': 120000}
]

This snippet sorts a list of employee dictionaries based on the salary key in ascending order. The itemgetter('salary') function is used to extract the salary from each dictionary during the sort process.

Method 2: Sorting in Descending Order

When sorting a list of dictionaries and you need the sorted list to be in descending order, you can still use itemgetter with the sorted() function, by setting the optional parameter reverse=True.

Here’s an example:

from operator import itemgetter

employees = [
    {'name': 'Alice', 'salary': 90000},
    {'name': 'Bob', 'salary': 50000},
    {'name': 'Diana', 'salary': 120000}
]

sorted_employees_desc = sorted(employees, key=itemgetter('salary'), reverse=True)
print(sorted_employees_desc)

Output:

[
    {'name': 'Diana', 'salary': 120000},
    {'name': 'Alice', 'salary': 90000},
    {'name': 'Bob', 'salary': 50000}
]

This code example is similar to the first method but adds reverse=True to the sorted() function, which sorts the employee dictionaries by the salary key in descending order.

Method 3: Sorting by Multiple Keys

Using itemgetter with the sorted() function also allows for sorting by multiple keys. By passing multiple parameters to itemgetter, it builds a tuple of values to sort by, in the specified order.

Here’s an example:

from operator import itemgetter

employees = [
    {'name': 'Alice', 'salary': 90000, 'age': 30},
    {'name': 'Bob', 'salary': 90000, 'age': 25},
    {'name': 'Diana', 'salary': 90000, 'age': 40}
]

sorted_employees_multi_keys = sorted(employees, key=itemgetter('salary', 'age'))
print(sorted_employees_multi_keys)

Output:

[
    {'name': 'Bob', 'salary': 90000, 'age': 25},
    {'name': 'Alice', 'salary': 90000, 'age': 30},
    {'name': 'Diana', 'salary': 90000, 'age': 40}
]

This snippet sorts the list of employees first by salary and then by age when the salaries are equal. The sort is done in ascending order for both keys.

Method 4: Custom Sorting Function

Sometimes a custom function is necessary for advanced sorting logic, such as based on calculation or conditional statements. While still using itemgetter, you can pass a lambda function or a named function to sorted() to achieve this custom behavior.

Here’s an example:

from operator import itemgetter

employees = [
    {'name': 'Alice', 'salary': 90000},
    {'name': 'Bob', 'salary': 50000},
    {'name': 'Diana', 'salary': 120000}
]

# Assume some complex condition is evaluated here
sorted_employees_custom = sorted(employees, key=lambda x: x['salary'] + 5000 if x['name'] == 'Alice' else x['salary'])
print(sorted_employees_custom)

Output:

[
    {'name': 'Bob', 'salary': 50000},
    {'name': 'Alice', 'salary': 90000},
    {'name': 'Diana', 'salary': 120000}
]

In this case, the custom sorting logic adds an arbitrary amount to Alice’s salary before sorting. It demonstrates how you can implement more tailored sorting criteria using a lambda function with itemgetter.

Bonus One-Liner Method 5: In-Place Sorting with List’s sort()

Python’s list object has a built-in sort() method that can perform an in-place sort, directly modifying the original list. You can use the itemgetter in conjunction with this method as well.

Here’s an example:

from operator import itemgetter

employees = [
    {'name': 'Alice', 'salary': 90000},
    {'name': 'Bob', 'salary': 50000},
    {'name': 'Diana', 'salary': 120000}
]

employees.sort(key=itemgetter('salary'))
print(employees)

Output:

[
    {'name': 'Bob', 'salary': 50000},
    {'name': 'Alice', 'salary': 90000},
    {'name': 'Diana', 'salary': 120000}
]

The sort() method sorts the list of employees in-place by the salary key in ascending order, which means the original list is changed and no new list is created.

Summary/Discussion

  • Method 1: Basic Sorting with itemgetter. Simple and effective for most cases. Only sorts in ascending order.
  • Method 2: Sorting in Descending Order. Similar to Method 1 but allows for reverse sorting. This is suitable when you need the largest values first.
  • Method 3: Sorting by Multiple Keys. Useful when secondary sorting criteria are needed. Complexity increases with more keys.
  • Method 4: Custom Sorting Function. Offers maximum flexibility. However, custom functions can reduce readability and may perform worse on large lists.
  • Bonus Method 5: In-Place Sorting with List’s sort(). More memory-efficient as it modifies the original list. Not applicable when a new sorted list is required.