Python:Kサイズの部分配列の最大合計値を基準にリスト(行列)をソートする方法
Pythonでは、各行における「Kサイズの部分配列(サブアレイ)の合計の最大値」を基準として、リストのリスト(行列)を並べ替えることができます。この処理には、組み込み関数の max() と sum() を組み合わせた関数を定義し、それを sort() メソッドの key 引数に渡す方法がシンプルかつ効果的です。
実装例
以下は、実際のコード例です。
def sort_matrix_K(my_list):
return max(sum(my_list[index: index + K]) for index in range(len(my_list) - K))
my_list = [[51, 23, 4, 24, 1], [45, 6, 26, 36, 5], [56, 16, 6, 36, 8], [5, 4, 36, 26, 26]]
print("リストの内容:")
print(my_list)
K = 4
print("K の値:")
print(K)
my_list.sort(key=sort_matrix_K)
print("ソート後のリスト:")
print(my_list)
出力結果
リストの内容: [[51, 23, 4, 24, 1], [45, 6, 26, 36, 5], [56, 16, 6, 36, 8], [5, 4, 36, 26, 26]] K の値: 4 ソート後のリスト: [[5, 4, 36, 26, 26], [51, 23, 4, 24, 1], [45, 6, 26, 36, 5], [56, 16, 6, 36, 8]]
解説
まず、
sort_matrix_Kという名前の関数を定義します。この関数は引数としてリストを受け取ります。関数内部では、リストを先頭から順に走査し、各インデックスから始まる K 個分の要素の合計を
sum()で求めます。スライスmy_list[index: index + K]を使うことで、連続する K 個の要素を簡単に取り出せます。得られた各合計値の中から
max()によって最大値を算出し、それを関数の戻り値として返します。関数の外側では、複数の行を持つリストのリスト(二次元配列)を定義し、その内容をコンソールに表示します。
続いて、比較対象となる部分配列のサイズ K を 4 として定義し、こちらもコンソールに出力します。
sort()メソッドのkey引数に先ほどの関数を指定すると、各行がこの関数に渡され、戻り値である「Kサイズ部分配列の合計の最大値」を基準に、リスト全体が昇順に並べ替えられます。最後に、ソート後のリストをコンソールに表示して処理は完了です。上の出力結果を見ると、合計値の小さい行から順に並んでいることが確認できます。
なお、range(len(my_list) - K) としていることで、スライス範囲がリストの末尾を超えないようになっています。このテクニックは、数値データを行単位で評価・分類したい場合など、さまざまな場面で応用できます。
-
Pythonでリストの累積和(プレフィックス合計)を求める方法
Pythonのリストは、順序付けられており変更可能なデータのコレクションです。リストは角括弧 [] を使って記述します。リストの要素にはインデックス番号を指定してアクセスでき、負のインデックスを使うと末尾から数えることができます(-1 は最後の要素を表します)。また、開始位置と終了位置を指定することで、範囲を指定したスライシングが可能です。範囲を指定した場合、戻り値として指定した要素を含む新しいリストが返されます。 累積和(プレフィックス合計)とは 累積和(プレフィックス合計)とは、リストの先頭から各位置までの要素を順番に足し合わせた値を並べたリストのことです。例えば [3, 4, 1] の場
-
Pythonで最大部分配列(Maximum Subarray)問題を解く方法【動的計画法】
最大部分配列問題とは 整数配列 A が与えられたとき、長さが 1 以上の連続する部分配列の中で、要素の合計が最大になるものを見つけ、その合計値を返すことを考えます。 例えば、配列 A = [-2, 1, -3, 4, -1, 2, 1, -5, 4] の場合、最大の合計は 6 となり、これは部分配列 [4, -1, 2, 1] の合計に相当します。 解き方:動的計画法(DP) この問題は、動的計画法(Dynamic Programming)を使うことで効率的に解くことができます。手順は以下の通りです。 配列 A と同じサイズの配列 dp を定義し、0 で初期化する dp[0] := A[0]