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

Pythonで2次元リストをソートするには、sorted()関数やlist.sort()メソッドを使用します。

これらの関数は、リスト内の各要素を基準にしてソートを行います。

昇順にソートするには、key引数にソート基準となる関数を指定し、reverse=Falseを設定します。

降順にソートする場合は、reverse=Trueを指定します。

例えば、各サブリストの最初の要素を基準にソートする場合、key=lambda x: x[0]を使用します。

この記事でわかること
  • 2次元リストを行ごとや列ごとにソートする方法
  • 特定の列を基準にした昇順・降順ソートの実装
  • 複数の列を基準にしたソートの手法
  • 数値と文字列が混在するリストのソート方法
  • ソート後のリストに対する操作方法

目次から探す

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

ソートの基本概念

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

Pythonでは、リストを簡単にソートするための組み込み関数sorted()やリストメソッドsort()が用意されています。

2次元リストは、リストの中にリストが含まれる構造で、行と列の形式でデータを管理します。

2次元リストをソートする際は、どの行や列を基準にするかを指定する必要があります。

ソートの種類(昇順・降順)

ソートには主に2つの種類があります。

スクロールできます
ソートの種類説明
昇順小さい値から大きい値の順に並べる。
降順大きい値から小さい値の順に並べる。

Pythonでは、sorted()関数sort()メソッドの引数で、昇順または降順を指定できます。

デフォルトでは昇順でソートされますが、降順にするにはreverse=Trueを指定します。

ソートのキーとラムダ関数

2次元リストをソートする際、特定の列を基準にするためには、ソートのキーを指定する必要があります。

これには、ラムダ関数を使用することが一般的です。

ラムダ関数は、無名関数を簡潔に定義できる機能で、特定の列の値を返すように設定します。

以下は、ラムダ関数を使ったソートの例です。

# 2次元リストの定義
data = [
    [3, 'apple'],
    [1, 'banana'],
    [2, 'cherry']
]
# 第1列を基準に昇順ソート
sorted_data = sorted(data, key=lambda x: x[0])
print(sorted_data)
[[1, 'banana'], [2, 'cherry'], [3, 'apple']]

このように、ラムダ関数を使うことで、特定の列を基準にしたソートが可能になります。

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

行ごとに昇順ソート

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

以下の例では、各行の要素を昇順にソートしています。

# 2次元リストの定義
data = [
    [3, 1, 2],
    [6, 5, 4],
    [9, 8, 7]
]
# 行ごとに昇順ソート
sorted_rows = [sorted(row) for row in data]
print(sorted_rows)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

列ごとに昇順ソート

列ごとに昇順にソートする場合、まずリストを転置してからソートを行います。

転置とは、行と列を入れ替える操作です。

以下の例では、列ごとに昇順にソートしています。

# 2次元リストの定義
data = [
    [3, 6, 9],
    [1, 5, 8],
    [2, 4, 7]
]
# 列ごとに昇順ソート
transposed = list(zip(*data))  # 転置
sorted_columns = [sorted(col) for col in transposed]
sorted_data = list(zip(*sorted_columns))  # 再度転置
print(sorted_data)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

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

特定の列を基準に昇順にソートする場合、sorted()関数を使用し、key引数にラムダ関数を指定します。

以下に2つの例を示します。

例:第1列を基準に昇順ソート

# 2次元リストの定義
data = [
    [3, 'apple'],
    [1, 'banana'],
    [2, 'cherry']
]
# 第1列を基準に昇順ソート
sorted_by_first_column = sorted(data, key=lambda x: x[0])
print(sorted_by_first_column)
[[1, 'banana'], [2, 'cherry'], [3, 'apple']]

例:第2列を基準に昇順ソート

# 2次元リストの定義
data = [
    [3, 'apple'],
    [1, 'banana'],
    [2, 'cherry']
]
# 第2列を基準に昇順ソート
sorted_by_second_column = sorted(data, key=lambda x: x[1])
print(sorted_by_second_column)
[[3, 'apple'], [1, 'banana'], [2, 'cherry']]

このように、特定の列を基準に昇順にソートすることができます。

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

行ごとに降順ソート

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

以下の例では、各行の要素を降順にソートしています。

# 2次元リストの定義
data = [
    [3, 1, 2],
    [6, 5, 4],
    [9, 8, 7]
]
# 行ごとに降順ソート
sorted_rows_desc = [sorted(row, reverse=True) for row in data]
print(sorted_rows_desc)
[[3, 2, 1], [6, 5, 4], [9, 8, 7]]

列ごとに降順ソート

列ごとに降順にソートする場合、まずリストを転置してからソートを行います。

転置とは、行と列を入れ替える操作です。

以下の例では、列ごとに降順にソートしています。

# 2次元リストの定義
data = [
    [3, 6, 9],
    [1, 5, 8],
    [2, 4, 7]
]
# 列ごとに降順ソート
transposed = list(zip(*data))  # 転置
sorted_columns_desc = [sorted(col, reverse=True) for col in transposed]
sorted_data_desc = list(zip(*sorted_columns_desc))  # 再度転置
print(sorted_data_desc)
[(3, 6, 9), (2, 5, 8), (1, 4, 7)]

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

特定の列を基準に降順にソートする場合、sorted()関数を使用し、key引数にラムダ関数を指定し、reverse=Trueを設定します。

以下に2つの例を示します。

例:第1列を基準に降順ソート

# 2次元リストの定義
data = [
    [3, 'apple'],
    [1, 'banana'],
    [2, 'cherry']
]
# 第1列を基準に降順ソート
sorted_by_first_column_desc = sorted(data, key=lambda x: x[0], reverse=True)
print(sorted_by_first_column_desc)
[[3, 'apple'], [2, 'cherry'], [1, 'banana']]

例:第2列を基準に降順ソート

# 2次元リストの定義
data = [
    [3, 'apple'],
    [1, 'banana'],
    [2, 'cherry']
]
# 第2列を基準に降順ソート
sorted_by_second_column_desc = sorted(data, key=lambda x: x[1], reverse=True)
print(sorted_by_second_column_desc)
[[2, 'cherry'], [1, 'banana'], [3, 'apple']]

このように、特定の列を基準に降順にソートすることができます。

応用例

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

複数の列を基準にソートする場合、sorted()関数key引数にタプルを返すラムダ関数を指定します。

タプルの最初の要素が最優先の基準となり、次に2番目の要素が基準になります。

以下の例では、まず第1列を基準に昇順、次に第2列を基準に昇順でソートしています。

# 2次元リストの定義
data = [
    [3, 'banana'],
    [1, 'apple'],
    [2, 'banana'],
    [1, 'cherry']
]
# 第1列と第2列を基準に昇順ソート
sorted_multiple_columns = sorted(data, key=lambda x: (x[0], x[1]))
print(sorted_multiple_columns)
[[1, 'apple'], [1, 'cherry'], [2, 'banana'], [3, 'banana']]

数値と文字列が混在するリストのソート

数値と文字列が混在するリストをソートする場合、デフォルトのソートではエラーが発生します。

そのため、数値と文字列を別々に扱う必要があります。

以下の例では、数値を先に、次に文字列を昇順にソートしています。

# 2次元リストの定義
data = [
    [3, 'banana'],
    [1, 'apple'],
    [2, 'cherry'],
    [4, 'date'],
    [5, 'apple']
]
# 数値と文字列を分けてソート
sorted_mixed = sorted(data, key=lambda x: (x[0], x[1]))
print(sorted_mixed)
[[1, 'apple'], [3, 'banana'], [2, 'cherry'], [4, 'date'], [5, 'apple']]

ソート後のリストの操作方法

ソート後のリストに対して、さらに操作を行うことができます。

例えば、ソートしたリストから特定の条件に合う要素をフィルタリングしたり、リストの要素を加工したりすることが可能です。

以下の例では、ソート後のリストから第1列の値が2以上の要素を抽出しています。

# 2次元リストの定義
data = [
    [3, 'banana'],
    [1, 'apple'],
    [2, 'cherry'],
    [4, 'date'],
    [5, 'apple']
]
# 昇順にソート
sorted_data = sorted(data, key=lambda x: x[0])
# 第1列の値が2以上の要素を抽出
filtered_data = [row for row in sorted_data if row[0] >= 2]
print(filtered_data)
[[2, 'cherry'], [3, 'banana'], [4, 'date'], [5, 'apple']]

このように、ソート後のリストに対してさまざまな操作を行うことができます。

よくある質問

ソートがうまくいかない場合の対処法

ソートがうまくいかない場合、以下の点を確認してください。

  • データ型の確認: 数値と文字列が混在している場合、エラーが発生することがあります。

データ型を統一するか、適切に処理する必要があります。

  • キーの指定: ソートの基準となるキーが正しく指定されているか確認します。

ラムダ関数の引数が正しいかどうかもチェックしましょう。

  • リストの構造: 2次元リストの構造が正しいか、リストの中にリストが含まれているか確認します。

ソートのパフォーマンスを向上させる方法

ソートのパフォーマンスを向上させるためには、以下の方法があります。

  • データの前処理: ソートする前に、不要なデータを削除したり、データを整理したりすることで、ソートの効率を上げることができます。
  • 適切なアルゴリズムの選択: 大規模なデータセットの場合、sorted()関数の代わりに、より効率的なソートアルゴリズムを実装することを検討します。
  • メモリの使用: 大きなリストを扱う場合、メモリの使用量を最適化することで、パフォーマンスを向上させることができます。

ソートの結果を元に戻す方法

ソートしたリストの結果を元に戻すには、元のリストを保持しておくことが重要です。

以下の方法で元のリストを保持できます。

  • コピーを作成: ソートを行う前に、元のリストのコピーを作成しておくことで、必要に応じて元の状態に戻すことができます。
  • sorted()関数の使用: sorted()関数は元のリストを変更せず、新しいリストを返すため、元のリストはそのまま保持されます。

まとめ

この記事では、Pythonにおける2次元リストのソート方法について詳しく解説しました。

具体的には、昇順・降順のソート、特定の列を基準にしたソート、さらには応用例として複数列のソートや混在データの処理方法についても触れました。

これを機に、実際のデータ処理において2次元リストのソートを活用してみてください。

  • URLをコピーしました!
目次から探す