Pythonで要素の合計が大きい行を上位N件抽出する方法(sortedとlambdaの活用)
リストの中に含まれる複数の行(サブリスト)から、要素の合計値が大きいものを指定した件数だけ取り出したい場合があります。このような処理には、Pythonの組み込み関数 sorted と lambda 式を組み合わせると、簡潔に実装できます。
実装例
以下に、具体的なコード例を示します。
my_list = [[2, 4, 6, 7], [2, 4, 8], [45], [1, 3, 5, 6], [8, 2, 1]]
print("リストの内容:")
print(my_list)
my_key = 3
print("抽出する行数(キー):")
print(my_key)
my_result = sorted(my_list, key=lambda row: sum(row), reverse=True)[:my_key]
print("結果のリスト:")
print(my_result)
出力結果
リストの内容: [[2, 4, 6, 7], [2, 4, 8], [45], [1, 3, 5, 6], [8, 2, 1]] 抽出する行数(キー): 3 結果のリスト: [[45], [2, 4, 6, 7], [1, 3, 5, 6]]
コードの解説
まず、複数のリストを含む「リストのリスト」を定義し、コンソールに表示します。
次に、抽出したい行数を表すキー値を定義し、こちらもコンソールに表示します。
sorted関数に対してkey=lambda row: sum(row)を指定することで、各行の要素の合計値をソート基準としています。さらにreverse=Trueを指定することで、合計値の降順に並べ替えられます。スライス記法
[:my_key]を使うことで、並べ替えた結果の先頭から指定した件数だけを取り出しています。最終的な結果は変数に代入され、コンソールに出力されます。
補足:動作のポイント
この例では、[45] の合計値が45と最も大きいため最初に、次いで合計19の [2, 4, 6, 7]、合計15の [1, 3, 5, 6] という順序で上位3行が抽出されています。なお、元のリスト自体は変更されず、新しいリストが生成される点にも注意してください。元のリストを直接並べ替えたい場合は、list.sort() メソッドを利用するとよいでしょう。
-
Pythonでn回の操作(挿入・コピー・ペースト)で入力できる最大文字数を求めるプログラム
問題概要 ある整数 n が与えられたとき、以下の3種類の操作をちょうど n 回行って画面に入力できる最大の文字数を求める問題です。 文字「x」を1つ挿入する 現在表示されているすべての文字をコピーする コピーした内容を貼り付ける(ペーストする) 例えば、入力が n = 12 の場合、出力は 81 になります。 解法のアプローチ この問題は、貪欲法(グリーディ法)を使うことで効率的に解けます。ポイントは、操作の組み合わせによって文字数の増加パターンが周期的に現れることです。 n が小さい場合(n ≤ 4)は、毎回「x」を挿入するだけが最適なので、答えはそのまま n になります。一方、n が
-
Pythonで最大の合計を持つ連続サブリスト(部分配列)の合計を求めるプログラム
配列 A が与えられたとき、「最大の合計を持つ連続した部分リスト(サブアレイ)」を見つけ、その合計値を返すことを考えます。例えば、配列が A = [-2, 1, -3, 4, -1, 2, 1, -5, 4] の場合、答えは合計 6 となり、該当する部分配列は [4, -1, 2, 1] です。解き方:動的計画法(DP)の活用この問題は、動的計画法(Dynamic Programming)を使うことで効率的に解けます。基本的な考え方は、「各位置で終わる部分配列の合計の最大値」を順番に求めていくというものです。配列 A と同じサイズの配列 dp を用意し、すべて 0 で初期化するdp[0] :=