【Python入門】リスト内の最大値のインデックスを取得する方法
Pythonでは、インデックスを使うことでリストから特定の要素や要素の範囲を取り出せます。ただし、目的の要素を取得するには、その値に対応するインデックス番号を把握しておく必要があります。
リスト内の最大値のインデックスを求めるには、max()関数とindex()メソッドを組み合わせるのが基本です。この記事では、リスト内の最大要素のインデックスを取得するプログラムの作り方を、具体例を交えてわかりやすく解説します。
max()とindex()を組み合わせて最大値のインデックスを取得する
ここでは、「数学テストで最も高い点数を取った生徒の名前を取得し、コンソールに出力するプログラム」を作成してみましょう。
まず、次のように2つのリストを用意します。
students = ["Andy", "April", "Julia", "Gary"]
grades = [75, 82, 64, 68]
1つ目のリスト「students」にはクラスの生徒名が、2つ目のリスト「grades」にはそれぞれの生徒のテストの点数が格納されています。
これらは「並列配列」と呼ばれる構造です。つまり、両方のリストは同じサイズであり、各位置の値同士が互いに関連付けられた1つのレコードを構成しています。「students」には名前が、「grades」にはその生徒が獲得した点数が対応して入っています。
次に、リスト内で最も大きい点数を見つけます。最大値を求めるには、組み込み関数のmax()を使用します。
largest = max(grades)
このコードで最大の数値そのものは取得できますが、本来欲しいのは「最大値が格納されているインデックス位置」です。そこで、もうひとつの組み込みメソッドであるindex()を活用します。
index_of_largest = grades.index(largest)
2つのリストが並列関係にあるため、「grades」リストにおける最高点のインデックス番号は、「students」リストにおけるその点数を取った生徒のインデックス番号と一致します。
続いて、誰が最高得点を取ったのかをコンソールに出力しましょう。
print("{} earned the highest grade in the class. Their grade was {}.".format(students[index_of_largest], largest))
インデックス構文を使って最高得点を取った生徒の名前を取得し、その名前と点数を文字列に埋め込んで表示しています。
プログラムを実行すると、次のような結果になります。
April earned the highest grade in the class. Their grade was 82.
コードは正しく最高得点の生徒を特定できました。なお、最小値のインデックスを求めたい場合は、max()をmin()に置き換えるだけで同じ要領で実装できます。
最大値と等しい複数のインデックスをすべて取得する方法
もし最高得点の生徒が2人以上いたらどうなるでしょうか? 先ほどのプログラムは、該当する点数を持つ最初の生徒のインデックスしか返しません。
特定の点数を取った全員のインデックスを取得したい場合は、リスト内包表記を使います。まず、先ほどと同様にデータを初期化し、最大値を求めるところから始めます。
students = ["Andy", "April", "Julia", "Gary", "Paul"]
grades = [75, 82, 64, 68, 82]
largest = max(grades)
今回は、2人の生徒が同じ点数を取った場合の動作を確認できるよう、レコードを1件追加しました。
次に、リスト内包表記を記述します。これにより、特定の点数を取ったすべての生徒のインデックス位置を一括で取得できます。
all_grades = [g for g, x in enumerate(grades) if x == largest]
このコードは「grades」リスト内のすべての点数を順に走査し、各点数をリスト内の最大値と比較します。最大値と等しい値が見つかるたびに、そのインデックスが新しいリストに追加されます。
enumerate()関数は、リストを「インデックス番号」と「値」のペアに分解してくれる便利な関数です。したがって、変数「g」はリスト内の要素のインデックスを、「x」は要素の値を表します。
続いて、forループを使い、最高得点を取った全生徒に対してメッセージを出力します。
for g in all_grades:
print("{} earned the highest grade in the class. Their grade was {}.".format(students[g], grades[g]))
最高得点の生徒が複数いる場合、forループはその人数分だけ繰り返されます。ループが回るたびに、生徒の名前と「クラスで最高得点を取った」というメッセージがコンソールに出力されます。
プログラムを実行すると、結果は次のようになります。
April earned the highest grade in the class. Their grade was 82.
Paul earned the highest grade in the class. Their grade was 82.
プログラムは、最高得点を取ったすべての生徒の名前を正しく表示できました。
まとめ
リスト内の要素のインデックスを取得するには、index()メソッドを使用します。min()やmax()と組み合わせれば、リスト内の最小値・最大値のインデックスも簡単に求められます。
さらに、リスト内包表記とenumerate()を活用すれば、最大値と等しい要素が複数ある場合でも、それらすべてのインデックスを一度に取得できます。これであなたも、Pythonエキスパートのようにリスト操作をこなせるようになったはずです!
-
【Python】リスト内包表記とenumerateでインデックス値を繰り返す方法
Pythonでは、リストの各要素の値に応じて、そのインデックス番号を繰り返した新しいリストを生成したいケースがあります。例えば、要素が「4」ならインデックス「0」を4回、「3」ならインデックス「2」を3回繰り返すといった処理です。このような操作は、リスト内包表記(list comprehension)と組み込み関数「enumerate」を組み合わせることで、シンプルかつ効率的に実現できます。サンプルコード以下に具体的な実装例を示します。my_list = [4, 0, 3, 1] print(The list is :) print(my_list) my_result = [elemen
-
Pythonでリスト内の要素のインデックスを取得する方法
index()メソッドで最初の出現位置を取得する リスト(文字列やタプルなど、他のシーケンス型でも同様)に用意されている index() メソッドを使うと、特定の要素が最初に出現する位置(インデックス)を簡単に見つけることができます。 >>> L1=[a, b, c, a, x] >>> L1 [a, b, c, a, x] >>> L1.index(a) 0 この例では、リスト L1 の中で a が最初に出現するのはインデックス 0 の位置であるため、0 が返されます。なお、指定した要素がリスト内に存在しない場合は ValueError