指定した属性インデックスに基づいてテーブルを並べ替えるPythonプログラム
問題の概要
アスリートに関する情報を格納した2次元リストを考えてみましょう。各要素は「順位(Rank)」「年齢(Age)」「身長(Height)」の3つの属性で構成され、1行が1人のアスリートの情報に対応しています。ここに、もうひとつ整数 k が与えられ、k番目の属性を基準にデータ全体を並べ替えることが求められます。
たとえば、入力が次のようなテーブルだったとします。
| Rank | Age | Height |
|---|---|---|
| 1 | 25 | 190 |
| 2 | 35 | 180 |
| 3 | 33 | 185 |
| 4 | 26 | 175 |
| 5 | 35 | 180 |
ここで k = 1(年齢を基準)とした場合、出力は次のようになります。
| Rank | Age | Height |
|---|---|---|
| 1 | 25 | 190 |
| 4 | 26 | 175 |
| 3 | 33 | 185 |
| 2 | 35 | 180 |
| 5 | 35 | 180 |
[[1, 25, 190], [4, 26, 175], [3, 33, 185], [2, 35, 180], [5, 35, 180]]
解決のアプローチ
この問題は、以下の手順で解決できます。
infoという名前の2次元配列に対してsort()関数を呼び出します。k番目の要素を基準にソートする関数(ラムダ式など)を定義し、それを
sort()関数のkeyパラメータに渡します。
実装例
理解を深めるために、以下のコード例を見てみましょう。
def solve(info, k): info.sort(key = lambda x: x[k]) return info info = [[1, 25, 190],[2, 35, 180],[3, 33, 185],[4, 26, 175],[5, 35, 180]] k = 1 print(solve(info, k))
入力
[[1, 25, 190],[2, 35, 180],[3, 33, 185],[4, 26, 175],[5, 35, 180]], 1
出力
[[1, 25, 190], [4, 26, 175], [3, 33, 185], [2, 35, 180], [5, 35, 180]]
コードのポイント
lambda x: x[k] は、各行 x を受け取り、その k番目の要素を返す無名関数です。key パラメータに渡すことで、その値を比較基準としてソートが行われます。
なお、Pythonの sort() は安定ソートであるため、同じ値を持つ行同士(上の例では年齢35歳の2人)は元の順序が保たれます。また、sort() は元のリストを直接変更する(破壊的な)メソッドなので、元のデータを残したい場合は組み込み関数 sorted(info, key=lambda x: x[k]) を使うとよいでしょう。
-
Pythonで学ぶ選択ソートの基本原理と実装方法をわかりやすく解説
本記事では、選択ソート(Selection Sort)の基本的な仕組みと、Python 3.xでの実装方法について詳しく解説します。 選択ソートとは? 選択ソートは、ソートされていない部分から最小値の要素を繰り返し見つけ出し、それを先頭に移動させることで配列全体を整列していくアルゴリズムです。処理の過程では、与えられた配列が次の2つの部分配列に分けられます。 すでにソートが完了している部分配列 まだソートされていない部分配列 選択ソートの各イテレーション(反復処理)では、未ソート部分から最小要素を取り出し、ソート済み部分の末尾に挿入していきます。この操作を繰り返すことで、最終的に配列全体
-
Pythonで選択ソートを実装する方法|仕組みとサンプルコードをわかりやすく解説
この記事では、選択ソート(Selection Sort)の基本的な仕組みと、Python 3.x(およびそれ以前のバージョン)での実装方法について解説します。 選択ソートとは 選択ソートは、ソートされていない部分から最小の要素を繰り返し見つけ出し、先頭側へ移動させることで配列全体を整列していくアルゴリズムです。処理の過程で、対象の配列は次の2つの部分配列に分けられます。 すでにソートが完了している部分配列 まだソートされていない部分配列 選択ソートの各イテレーションでは、未ソートの部分配列から最小要素を取り出し、ソート済みの部分配列の末尾に追加していきます。 アルゴリズムの動作イメー