Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでネストされたリストから2番目に低い点数の生徒の名前をすべて表示する方法

ネストされたリストに各生徒の名前と点数が格納されている場合を考えてみましょう。この中から、2番目に低い点数を持つ生徒の名前をすべて表示したいという要件があります。もし2番目に低い点数を持つ生徒が複数人いる場合は、それらをアルファベット順に並べ替えて、1行に1つずつ名前を出力します。

例えば、入力が以下のようなリストだったとします。

students = [['Amal',37],['Bimal',37],['Tarun',36],['Akash',41],['Himadri',39]]

この場合、出力は AmalBimal になります。最も低い点数は Tarun の36点であり、2番目に低い点数は37点です。この37点を持つのは Amal と Bimal の2人なので、アルファベット順に並べて出力されます。

解決の手順

この問題を解くためには、以下のステップに従います。

  • まず、全生徒の中で最小の点数(min_mark)を求めます。
  • 次に、min_mark より大きい点数を持つ生徒だけを残して、リストを作り直します。
  • その新しいリストの中で再び最小の点数(min2_mark)を求めます。これが「2番目に低い点数」になります。
  • min2_mark と同じ点数を持つ生徒の名前だけを抽出し、ソートしたリストを作成します。
  • 最後に、リスト内の各名前を1行ずつ出力します。

実装例

理解を深めるために、実際のコードを見てみましょう。

def solve(students):
    min_mark = min(x[1] for x in students)
    students = [x for x in students if x[1] > min_mark]
    min2_mark = min(x[1] for x in students)
    students = sorted([x[0] for x in students if x[1] == min2_mark])
    for x in students:
        print(x)

students = [['Amal',37],['Bimal',37],['Tarun',36],['Akash',41],['Himadri',39]]
solve(students)

このコードでは、ジェネレータ式と min() 関数を使って最小値を効率的に求めています。また、リスト内包表記によって条件に合う要素だけを抽出し、sorted() 関数で名前をアルファベット順に並べ替えています。

コードの流れを詳しく見る

ステップ1: min(x[1] for x in students) により、すべての点数 [37, 37, 36, 41, 39] の中から最小値 36 を取得します。

ステップ2: 点数が36より大きい生徒、すなわち [['Amal',37],['Bimal',37],['Akash',41],['Himadri',39]] だけが残ります。

ステップ3: 残ったリストから再び最小値を求めると 37 が得られます。これが2番目に低い点数です。

ステップ4: 点数が37である生徒の名前 ['Amal', 'Bimal'] を抽出し、ソートします。

ステップ5: 各名前を1行ずつ出力します。

入力

[['Amal',37],['Bimal',37],['Tarun',36],['Akash',41],['Himadri',39]]

出力

Amal
Bimal

補足:sorted()を使ったよりシンプルな別解

Pythonの set() を活用すると、重複する点数を排除しながら同様の処理を簡潔に書くこともできます。

def solve(students):
    scores = sorted(set(score for _, score in students))
    second_lowest = scores[1]
    names = sorted(name for name, score in students if score == second_lowest)
    for name in names:
        print(name)

こちらの方法では、点数をセットにすることで自動的に重複が除去され、昇順にソートしたリストの2番目の要素(インデックス1)が「2番目に低い点数」になります。可読性が高いため、実務でもおすすめのアプローチです。

  1. 【Python入門】リストから一意の値(重複しない要素)だけを抽出して出力する方法

    リストが与えられたとき、その中から重複を除いた一意の値(ユニークな要素)だけを取り出して表示するのが、この記事の目的です。Pythonを使えば、初心者でも簡単に実装できる定番の処理なので、ぜひマスターしておきましょう。実行例入力:A = [1, 2, 3, 4, 2, 1, 9] 出力:[1, 2, 3, 4, 9]リスト内に同じ値が複数回現れていても、出力されるのはそれぞれ1回だけです。アルゴリズムステップ1:ユーザーからリストを入力として受け取る。 ステップ2:空のリストを作成する。 ステップ3:元のリストの全要素を順番に走査する。 ステップ4:その要素がすでに一意のリストに存在するかどう

  2. Pythonでリストのすべてのサブリストを生成して出力する方法

    リストが与えられたとき、そのリストに含まれるすべてのサブリスト(部分リスト)を生成して出力するプログラムを紹介します。要素数 n のリストの場合、空のリストを含めるとサブリストの総数は n×(n+1)/2+1 個になります。 実行例 入力 : list = [1, 2, 3] 出力 : [], [1], [1, 2], [1, 2, 3], [2], [2, 3], [3] アルゴリズム 考え方はシンプルです。開始位置 i と終了位置 j の組み合わせをすべて試し、スライスで部分リストを取り出します。 ステップ1 : 対象となるリストを用意します。 ステップ2 : 結果を格納するため、最