Pythonで行列の各列を昇順にソートする方法を解説
問題の概要
行列が与えられたとき、それぞれの列を昇順(小さい順)に並べ替えるという問題を考えます。行ごとではなく、列単位でソートするのがポイントです。
例えば、次のような行列が入力されたとします。
| 11 | 21 | 31 |
| 6 | 6 | 4 |
| 1 | 11 | 8 |
この場合、出力は次のようになります。
| 1 | 6 | 4 |
| 6 | 11 | 8 |
| 11 | 21 | 31 |
1列目は 11, 6, 1 が 1, 6, 11 に、2列目は 21, 6, 11 が 6, 11, 21 に、3列目は 31, 4, 8 が 4, 8, 31 に、それぞれ昇順に並べ替えられていることが分かります。
解き方のアルゴリズム
この問題は、次の手順で解くことができます。
- R := 行列の行数、C := 行列の列数とする
- res := 元の行列と同じサイズの行列を作成し、すべての要素を 0 で初期化する
- col を 0 から C-1 まで繰り返す
- values := 全行の col 列目の要素を集めたリストを作る
- row を 0 から R-1 まで繰り返す
- res[row][col] := values の末尾から要素を1つ取り出して代入する
- res を返す
Pythonでの実装例
それでは、実際のコードを見てみましょう。
class Solution: def solve(self, matrix): R = len(matrix) C = len(matrix[0]) res = [[0] * C for _ in range(R)] for col in range(C): values = [r[col] for r in matrix] values.sort(reverse=True) for row in range(R): res[row][col] = values.pop() return res ob = Solution() matrix = [[11, 21, 31], [6, 6, 4], [1, 11, 8]] print(ob.solve(matrix))
入力
[[11, 21, 31], [6, 6, 4], [1, 11, 8]]
出力
[[1, 6, 4], [6, 11, 8], [11, 21, 31]]
コードのポイント
このコードの動作を整理すると、次の3つのステップに分けられます。
- 列の抽出: リスト内包表記
[r[col] for r in matrix]により、全行から col 列目の値だけを集めたリスト values を作成します。 - 降順ソートのテクニック:
sort(reverse=True)であえて降順に並べ替えておくことで、pop()で末尾から取り出すと自然に昇順になります。 - 結果の再構築: 取り出した値を、結果用の行列 res の同じ列に上から順に格納していきます。
zipを使った別解
Pythonでは zip(*matrix) を使うと行列を簡単に転置できます。これを利用すると、より簡潔に記述することも可能です。
def solve(matrix): return [list(col) for col in zip(*[sorted(c) for c in zip(*matrix)])]
「転置 → 各行(元の列)をソート → 再転置」という流れで処理しており、Pythonらしいスマートな書き方と言えます。用途や可読性の観点から、両者の使い分けを検討してみてください。
-
Pythonでソート済み2D行列を効率的に検索する方法(Search a 2D Matrix II)
問題の概要 m × n の行列が与えられたとき、その中から特定の値を効率的に検索するアルゴリズムを実装することを考えます。この行列には、以下のような性質があります。 各行の整数は、左から右に向かって昇順に並んでいる 各列の整数は、上から下に向かって昇順に並んでいる 行列の例 たとえば、次のような5×5の行列を考えてみましょう。 1471115 2581219 3691622 1013141724 1821232630 このとき、検索対象(target)が「5」であれば True を返し、「20」であれば False を返します。 アルゴリズムの考え方 この問題を効率的に解く鍵となるのは
-
Pythonで行列を転置する4つの方法を徹底解説!コード例付き
行列の転置とは? 行列の転置(transpose)とは、行列の列と行を入れ替える操作のことです。転置を行うと、元の行列の列が行になり、行が列になります。 具体例を使って理解しましょう。次のような元の行列「x」があるとします。 x = [[1,2],[3,4],[5,6]] この行列「x」には2つの列があり、1つ目の列には 1, 3, 5、2つ目の列には 2, 4, 6 が含まれています。 この行列を転置すると、列が行に入れ替わります。転置後の行列は次のようになります。 x1 = [[1, 3, 5],[2, 4, 6]] このように、転置後の新しい行列「x1」は、元の行列とは値の配置が異なる形