【Python】2次元リストをソート(昇順・降順)する方法を解説

この記事では、2次元リストを昇順や降順にソートする基本的な方法から、特定の列を基準にしたソート、さらにはカスタムソートまで、初心者にもわかりやすく解説します。

Pythonのソート関数やメソッドを使って、データを効率的に並べ替える方法を一緒に学びましょう。

目次から探す

2次元リストのソート方法

ソートの基本概念

ソートとは、データを特定の順序に並べ替える操作のことです。

一般的には、昇順(小さい順から大きい順)や降順(大きい順から小さい順)に並べ替えます。

Pythonでは、リストやタプルなどのシーケンスデータを簡単にソートするための関数やメソッドが用意されています。

2次元リストとは、リストの中にリストが含まれているデータ構造のことです。

例えば、以下のようなリストが2次元リストです。

matrix = [
    [3, 1, 2],
    [9, 7, 8],
    [6, 4, 5]
]

このような2次元リストをソートする場合、行ごとにソートするのか、列ごとにソートするのか、特定の列を基準にソートするのかなど、さまざまな方法があります。

Pythonのソート関数

Pythonには、リストをソートするための便利な関数やメソッドがいくつか用意されています。

ここでは、代表的なsorted()関数sort()メソッドについて解説します。

sorted()関数

sorted()関数は、元のリストを変更せずに新しいソート済みのリストを返します。

元のリストを保持したままソート結果を得たい場合に便利です。

以下は、sorted()関数の基本的な使い方の例です。

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

sorted()関数は、デフォルトで昇順にソートしますが、引数にreverse=Trueを指定することで降順にソートすることもできます。

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

sort()メソッド

sort()メソッドは、リスト自身をソートし、元のリストを変更します。

新しいリストを作成せずにソートを行いたい場合に便利です。

以下は、sort()メソッドの基本的な使い方の例です。

numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
numbers.sort()
print(numbers)  # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

sort()メソッドも、引数にreverse=Trueを指定することで降順にソートすることができます。

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

以上が、Pythonの基本的なソート関数とメソッドの使い方です。

次のセクションでは、これらの関数やメソッドを使って2次元リストをソートする方法について詳しく解説します。

2次元リストを昇順にソートする方法

2次元リストを昇順にソートする方法には、行ごとにソートする方法、列ごとにソートする方法、特定の列を基準にソートする方法があります。

それぞれの方法について具体的な例を交えて解説します。

行ごとにソートする

行ごとにソートする場合、各行(リスト内のリスト)を個別にソートします。

Pythonではsort()メソッドsorted()関数を使って簡単に行ごとにソートすることができます。

行ごとの昇順ソートの例

以下に、行ごとに昇順ソートする例を示します。

# 2次元リストの定義
matrix = [
    [3, 1, 2],
    [9, 7, 8],
    [6, 5, 4]
]
# 各行を昇順にソート
for row in matrix:
    row.sort()
# 結果を表示
print(matrix)

このコードを実行すると、各行が昇順にソートされます。

[[1, 2, 3], [7, 8, 9], [4, 5, 6]]

列ごとにソートする

列ごとにソートする場合、各列を個別にソートします。

Pythonでは、リストの内包表記やzip関数を使って列ごとにソートすることができます。

列ごとの昇順ソートの例

以下に、列ごとに昇順ソートする例を示します。

# 2次元リストの定義
matrix = [
    [3, 1, 2],
    [9, 7, 8],
    [6, 5, 4]
]
# 列ごとにソートするために転置
transposed_matrix = list(zip(*matrix))
# 各列を昇順にソート
sorted_transposed_matrix = [sorted(col) for col in transposed_matrix]
# 元の形に戻すために再転置
sorted_matrix = list(zip(*sorted_transposed_matrix))
# 結果を表示
print(sorted_matrix)

このコードを実行すると、各列が昇順にソートされます。

[(3, 1, 2), (6, 5, 4), (9, 7, 8)]

特定の列を基準にソートする

特定の列を基準にソートする場合、その列の値を基準にして行全体をソートします。

Pythonではsorted()関数key引数を使って特定の列を基準にソートすることができます。

特定の列を基準にした昇順ソートの例

以下に、特定の列を基準に昇順ソートする例を示します。

ここでは、2列目(インデックス1)を基準にソートします。

# 2次元リストの定義
matrix = [
    [3, 1, 2],
    [9, 7, 8],
    [6, 5, 4]
]
# 2列目を基準に昇順ソート
sorted_matrix = sorted(matrix, key=lambda x: x[1])
# 結果を表示
print(sorted_matrix)

このコードを実行すると、2列目を基準に行全体が昇順にソートされます。

[[3, 1, 2], [6, 5, 4], [9, 7, 8]]

以上が、2次元リストを昇順にソートする方法です。

次に、2次元リストを降順にソートする方法について解説します。

2次元リストを降順にソートする方法

2次元リストを降順にソートする方法について解説します。

昇順と同様に、行ごと、列ごと、特定の列を基準にソートする方法があります。

それぞれの方法について具体的な例を交えて説明します。

行ごとにソートする

行ごとにソートする場合、各行の要素を降順に並べ替えます。

Pythonのsort()メソッドsorted()関数を使用して、各行を降順にソートすることができます。

行ごとの降順ソートの例

以下に、行ごとに降順ソートする例を示します。

# 2次元リストの定義
matrix = [
    [3, 1, 4],
    [1, 5, 9],
    [2, 6, 5]
]
# 各行を降順にソート
for row in matrix:
    row.sort(reverse=True)
# 結果を表示
print(matrix)

このコードを実行すると、各行が降順にソートされます。

[[4, 3, 1], [9, 5, 1], [6, 5, 2]]

列ごとにソートする

列ごとにソートする場合、各列の要素を降順に並べ替えます。

列ごとにソートするためには、リストの転置を行い、行ごとにソートした後、再度転置する必要があります。

列ごとの降順ソートの例

以下に、列ごとに降順ソートする例を示します。

# 2次元リストの定義
matrix = [
    [3, 1, 4],
    [1, 5, 9],
    [2, 6, 5]
]
# リストの転置
transposed_matrix = list(map(list, zip(*matrix)))
# 各行(元の列)を降順にソート
for row in transposed_matrix:
    row.sort(reverse=True)
# 再度転置して元の形に戻す
sorted_matrix = list(map(list, zip(*transposed_matrix)))
# 結果を表示
print(sorted_matrix)

このコードを実行すると、各列が降順にソートされます。

[[3, 6, 9], [2, 5, 5], [1, 1, 4]]

特定の列を基準にソートする

特定の列を基準にソートする場合、その列の値を基準にして行全体を並べ替えます。

sorted()関数key引数を使用して、特定の列を基準に降順ソートを行います。

特定の列を基準にした降順ソートの例

以下に、特定の列を基準に降順ソートする例を示します。

ここでは、2列目(インデックス1)を基準にソートします。

# 2次元リストの定義
matrix = [
    [3, 1, 4],
    [1, 5, 9],
    [2, 6, 5]
]
# 2列目を基準に降順ソート
sorted_matrix = sorted(matrix, key=lambda x: x[1], reverse=True)
# 結果を表示
print(sorted_matrix)

このコードを実行すると、2列目を基準に行全体が降順にソートされます。

[[2, 6, 5], [1, 5, 9], [3, 1, 4]]

以上が、2次元リストを降順にソートする方法です。

行ごと、列ごと、特定の列を基準にソートする方法を理解することで、さまざまなデータの並べ替えに対応できるようになります。

応用例

2次元リストのソートには、基本的な昇順・降順のソート以外にも、複数の列を基準にしたソートやカスタムソートなど、さまざまな応用方法があります。

ここでは、それらの応用例について詳しく解説します。

複数の列を基準にソートする

複数の列を基準にソートする場合、まず第一基準の列でソートし、次に第二基準の列でソートするという手順を踏みます。

Pythonでは、sorted()関数sort()メソッドを使って、複数のキーを指定することができます。

複数の列を基準にしたソートの例

以下の例では、2次元リストを第一基準として第2列(インデックス1)、第二基準として第1列(インデックス0)でソートします。

# 2次元リストの定義
data = [
    [3, 2, 5],
    [1, 3, 4],
    [2, 1, 6],
    [1, 2, 3]
]
# 複数の列を基準にソート
sorted_data = sorted(data, key=lambda x: (x[1], x[0]))
# 結果の表示
print(sorted_data)

このコードを実行すると、以下のような結果が得られます。

[[2, 1, 6], [1, 2, 3], [3, 2, 5], [1, 3, 4]]

この結果は、まず第2列(インデックス1)で昇順にソートされ、その後に第1列(インデックス0)で昇順にソートされています。

カスタムソート

カスタムソートでは、特定の条件に基づいてリストをソートすることができます。

例えば、特定の列の値が偶数か奇数かでソートしたり、文字列の長さでソートしたりすることができます。

カスタムソートの例

以下の例では、2次元リストを第3列(インデックス2)の値が偶数か奇数かでソートし、偶数が先に来るようにします。

# 2次元リストの定義
data = [
    [3, 2, 5],
    [1, 3, 4],
    [2, 1, 6],
    [1, 2, 3]
]
# カスタムソート
sorted_data = sorted(data, key=lambda x: x[2] % 2)
# 結果の表示
print(sorted_data)

このコードを実行すると、以下のような結果が得られます。

[[1, 3, 4], [2, 1, 6], [3, 2, 5], [1, 2, 3]]

この結果は、第3列(インデックス2)の値が偶数の行が先に来るようにソートされています。

カスタムソートを使うことで、特定の条件に基づいた柔軟なソートが可能になります。

これにより、データの特性に応じた最適なソートを実現することができます。

目次から探す