5 Best Ways to Sort a Python List of Lists by the Second Element

πŸ’‘ Problem Formulation: When working with a list of lists in Python, you may encounter a situation where you need to sort the entire collection based on the second element of each sublist. For example, consider the input [[1, 3], [4, 2], [0, 1]]; you want to organize this into [[0, 1], [4, 2], [1, 3]], sorted according to the second value of each inner list.

Method 1: Using the sort() Function

This method involves using the sort() function with a custom key function. The sort() function is a method that sorts the list in-place using an optional key argument that specifies a function to be called on each list element before making comparisons.

Here’s an example:

data_list = [[1, 3], [4, 2], [0, 1]]
data_list.sort(key=lambda x: x[1])
print(data_list)

Output:

[[0, 1], [4, 2], [1, 3]]

The example demonstrates the in-place sorting of the given list of lists, using a lambda function that takes each sublist ‘x’ and returns the second element ‘x[1]’ to be used as a key for sorting.

Method 2: Using the sorted() Function

The sorted() function returns a new list containing all elements from the iterable in ascending order, and it also accepts a key parameter to specify a function to be called on each list element prior to comparisons.

Here’s an example:

data_list = [[1, 3], [4, 2], [0, 1]]
sorted_list = sorted(data_list, key=lambda x: x[1])
print(sorted_list)

Output:

[[0, 1], [4, 2], [1, 3]]

In this snippet, we create a new sorted list using the sorted() function, similarly utilizing a lambda function to focus on the second sub-element as the sorting key.

Method 3: Using itemgetter from the operator Module

The itemgetter() function from the operator module simplifies key functions. It’s often faster than manual key functions realized as lambdas.

Here’s an example:

from operator import itemgetter
data_list = [[1, 3], [4, 2], [0, 1]]
data_list.sort(key=itemgetter(1))
print(data_list)

Output:

[[0, 1], [4, 2], [1, 3]]

This method uses the sort() function with the itemgetter(1) providing a concise and potentially more efficient key function to sort the lists by the second element.

Method 4: Sorting Using a For Loop

While not as Pythonic, sorting can be done manually with a for loop. This method is less efficient and more verbose but provides a deeper understanding of the sorting process.

Here’s an example:

data_list = [[1, 3], [4, 2], [0, 1]]

for i in range(len(data_list)):
    for j in range(i + 1, len(data_list)):
        if data_list[i][1] > data_list[j][1]:
            data_list[i], data_list[j] = data_list[j], data_list[i]

print(data_list)

Output:

[[0, 1], [4, 2], [1, 3]]

This code snippet manually compares and swaps elements to sort the list based on the second element of the sublists.

Bonus One-Liner Method 5: Using a List Comprehension

This one-liner uses a nested list comprehension along with a temporary list of tuples for sorting. It’s concise but can be less readable for complex operations.

Here’s an example:

data_list = [[1, 3], [4, 2], [0, 1]]
data_list = [x for _, x in sorted((sub[1], sub) for sub in data_list)]
print(data_list)

Output:

[[0, 1], [4, 2], [1, 3]]

The one-liner creates a list of tuples, sorts them, and then unpacks the sublists back into the original format.

Summary/Discussion

  • Method 1: sort() Function. Mutates the list in place. Efficient for memory as it does not create a new list. Best when the original order does not need to be preserved.
  • Method 2: sorted() Function. Creates a new sorted list. Ideal when you need to retain the original list. It’s the preferred method when immutability is important.
  • Method 3: itemgetter from operator Module. Potentially faster execution. Clean and readable. The downside is the additional import (though minor).
  • Method 4: For Loop. Manual sorting teaches sorting fundamentals. It’s very customizable but inefficient and verbose for large lists.
  • Method 5: List Comprehension. Elegant and one-liner code. However, it can be less readable, especially for beginners or complex sorting criteria.