5 Best Ways to Sort a List of Dictionaries in Python Based on Value

πŸ’‘ Problem Formulation: When working with lists of dictionaries in Python, you may encounter the need to sort them by the value of specific keys. For instance, you may have a list of dictionaries with user data, and you want to sort these dictionaries based on the age of the users. The input would be a list of dictionaries with key-value pairs, and your desired output is a list sorted by the ‘age’ key in ascending or descending order.

Method 1: Using the sorted() Function with a Lambda Function

The sorted() function in Python, combined with a lambda function, is a concise way to sort a list of dictionaries. This method is ideal when you’re looking for a one-time operation and prefer not to alter the original list. You specify the key for sorting within the lambda, which returns the value to be compared.

Here’s an example:

users = [{'name': 'Alice', 'age': 30},
         {'name': 'Bob', 'age': 25},
         {'name': 'Charlie', 'age': 35}]
sorted_users = sorted(users, key=lambda x: x['age'])
print(sorted_users)

Output:

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

A lambda function is used here as a key argument to sorted(). It iterates over every dictionary in the list and sorts them based on the value corresponding to the ‘age’ key.

Method 2: Using the sorted() Function with the itemgetter()

The itemgetter() function from the operator module can be used with the sorted() function to specify the key parameter. It is a more efficient and faster alternative to lambda functions when dealing with larger datasets.

Here’s an example:

from operator import itemgetter

users = [{'name': 'Alice', 'age': 30},
         {'name': 'Bob', 'age': 25},
         {'name': 'Charlie', 'age': 35}]
sorted_users = sorted(users, key=itemgetter('age'))
print(sorted_users)

Output:

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

Unlike the lambda function, itemgetter('age') directly retrieves the ‘age’ values to sort the list of dictionaries, providing improved performance for large datasets.

Method 3: Sorting In-Place with the list.sort() Method

This method sorts the list of dictionaries in place using the list.sort() method combined with a lambda function. This modifies the original list instead of returning a new sorted list.

Here’s an example:

users = [{'name': 'Alice', 'age': 30},
         {'name': 'Bob', 'age': 25},
         {'name': 'Charlie', 'age': 35}]
users.sort(key=lambda x: x['age'])
print(users)

Output:

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

The list users is sorted in place, and no new list is created. This method is more memory efficient since it does not require extra space for another sorted list.

Method 4: Using the sorted() Function with a Custom Function

If you need more complex sorting logic, you can define a custom function and use it with the sorted() function. This method is readable and can handle more sophisticated sorting requirements.

Here’s an example:

def get_age(user_dict):
    return user_dict['age']

users = [{'name': 'Alice', 'age': 30},
         {'name': 'Bob', 'age': 25},
         {'name': 'Charlie', 'age': 35}]
sorted_users = sorted(users, key=get_age)
print(sorted_users)

Output:

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

By defining a separate function get_age(), the code becomes more modular, making it easier to read and maintain, especially for complex sorting logic.

Bonus One-Liner Method 5: Sorting with List Comprehension

Sorting can also be achieved with a one-liner using list comprehension and the sorted() function. This method is compact but might be less readable for complex sorting criteria.

Here’s an example:

users = [{'name': 'Alice', 'age': 30},
         {'name': 'Bob', 'age': 25},
         {'name': 'Charlie', 'age': 35}]
sorted_users = [dict(t) for t in sorted((d.items() for d in users), key=lambda x: x[1])]
print(sorted_users)

Output:

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

This sorting method uses a list comprehension to create tuples of dictionary items and sorts them by the second element of each tuple, which corresponds to the dictionary value.

Summary/Discussion

  • Method 1: Using the sorted() function with a lambda function. Strengths: Readable, non-destructive. Weaknesses: Might be slower for large datasets.
  • Method 2: Using the sorted() function with itemgetter(). Strengths: Faster and efficient. Weaknesses: Less intuitive for those new to Python.
  • Method 3: Sorting in-place with the list.sort() method. Strengths: Memory efficient. Weaknesses: Destructive, as it changes the original list.
  • Method 4: Using the sorted() function with a custom function. Strengths: Clear and modular for complex sorting. Weaknesses: Requires additional function definition.
  • Method 5: Sorting with list comprehension. Strengths: Compact one-liner. Weaknesses: Less readable and potentially confusing.