Pythonでタプルのリストから最小値を持つレコードを取得する方法(min と itemgetter の活用)
タプルのリストの中から、特定のインデックス(位置)の値が最小となるタプルを取得したいケースはよくあります。そんなときは、組み込み関数の min() と、operator モジュールの itemgetter を組み合わせることで、シンプルかつ効率的に実現できます。
min() 関数は、イテラブル(反復可能オブジェクト)内の要素のうち最小のものを返します。一方、itemgetter は、オペランド(対象のオブジェクト)から特定の位置にある項目を取り出すための呼び出し可能オブジェクトを生成します。この2つを組み合わせれば、「どのインデックスの値を比較対象にするか」を柔軟に指定できるのです。
以下に、実際の動作を示します。
サンプルコード
from operator import itemgetter
my_list = [('Will', 45), ('Jam', 13), ('Pow', 89), ('Nyk', 56)]
print("The list is: ")
print(my_list)
my_result = min(my_list, key = itemgetter(1))[0]
print("The value with minimum score is : ")
print(my_result)
出力結果
The list is:
[('Will', 45), ('Jam', 13), ('Pow', 89), ('Nyk', 56)]
The value with minimum score is :
Jam
コードの解説
- まず、
operatorモジュールからitemgetterをインポートします。 - 名前とスコア(数値)を格納したタプルのリストを定義し、コンソールに表示します。
min()関数をこのタプルのリストに適用し、引数keyにitemgetter(1)を指定します。これにより、各タプルのインデックス1(2番目の要素=スコア)が比較対象になります。itemgetterは、オペランドから特定の位置の項目を取り出す役割を担います。- 最小スコアを持つタプルが返されるので、続けて
[0]でそのタプルの先頭要素(名前)を取り出し、変数に代入します。 - 最後に、その変数の内容をコンソールに出力して完了です。
補足:lambda を使った別の書き方
itemgetter の代わりに lambda 式を使っても、同じ結果が得られます。
my_result = min(my_list, key=lambda x: x[1])[0]
また、逆に最大値を持つレコードを取得したい場合は、min() を max() に置き換えるだけで対応できます。状況に応じて使い分けると、データ処理のコードがより読みやすく、保守しやすくなります。
-
Pythonで解く「最小値が最大となる経路」問題 ― ヒープを使った貪欲法アルゴリズム
R行C列の整数で構成される行列Aが与えられます。このとき、左上のセル [0, 0] を出発点とし、右下のセル [R-1, C-1] を終点とする経路の中から、「経路上のセルのうち最小の値」をスコアとしたとき、そのスコアが最大になる経路を見つけます。例えば、ある経路が 8 → 4 → 5 → 9 と辿るとき、経路上の最小値は 4 なので、この経路のスコアは 4 となります。経路は、現在いるセルから上下左右の4方向(北・東・南・西)にある未訪問セルへ移動することで伸ばしていきます。具体例次のようなグリッドを考えてみましょう。545126746オレンジ色で示されたセルが最適な経路です。この経路上の最
-
Pythonでリストのリストから各インデックスの最小値を求める方法
プログラミングでは、リスト内の各要素の最小値を求めたいケースがよくあります。特に行列演算を扱う場合、行列の各列の最小値を求める必要があります。Pythonでは、行列の各列は「リストのリスト」として表現されるため、これは「リストのリストから各インデックス(位置)ごとの最小値を取り出す」処理に相当します。本記事では、この問題を解決するための代表的な2つの方法を、具体的なコード例とともにわかりやすく解説します。方法1:min()とzip()を組み合わせる最もシンプルな方法は、組み込み関数のmin()とzip()を組み合わせるアプローチです。zip()関数を使うと、複数のリストから同じインデックス位置