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

【Python】リストから最大値・最小値・2番目に大きい値・2番目に小さい値を求める方法

この記事では、Pythonを使ってリスト(配列)の中から最大値最小値2番目に大きい値(second largest)2番目に小さい値(second smallest)を一度に見つけるプログラムを解説します。ソートを行わずに1回のループで処理できるのがポイントです。

アルゴリズム

全体の流れは以下の3ステップです。

ステップ1:リストの要素を入力する
ステップ2:各要素を取り出し、リスト内の他の数値と順に比較する
ステップ3:最大値・最小値・2番目に大きい値・2番目に小さい値を取得して表示する

サンプルコード

# リスト内の最大値・最小値・2番目に大きい値・2番目に小さい値を求める
def maxmin(A):
    maxi = A[0]          # 最大値の候補
    secondsmax = A[0]    # 2番目に大きい値の候補
    mini = A[0]          # 最小値の候補
    secondmini = A[0]    # 2番目に小さい値の候補

    for item in A:
        if item > maxi:
            maxi = item
        elif secondsmax != maxi and secondsmax < item:
            secondsmax = item
        elif item < mini:
            mini = item
        elif secondmini != mini and secondmini > item:
            secondmini = item

    print("最大要素は ::>", maxi)
    print("2番目に大きい要素は ::>", secondsmax)
    print("最小要素は ::>", mini)
    print("2番目に小さい要素は ::>", secondmini)

# ドライバーコード
A = list()
n = int(input("リストのサイズを入力してください ::"))
print("数値を入力してください ::")
for i in range(int(n)):
    k = int(input(""))
    A.append(int(k))

maxmin(A)

実行結果

リストのサイズを入力してください ::6
数値を入力してください ::
12
30
2
34
90
67
最大要素は ::> 90
2番目に大きい要素は ::> 67
最小要素は ::> 2
2番目に小さい要素は ::> 12

コードの解説

まず、4つの変数(maxisecondsmaxminisecondmini)をリストの先頭要素 A[0] で初期化します。その後、for ループで各要素を1つずつ取り出し、以下の条件で判定していきます。

  • item > maxi の場合: より大きな値が見つかったので、最大値を更新します。
  • secondsmax が maxi と異なり、かつ item の方が大きい場合: 2番目に大きい値を更新します。
  • item < mini の場合: より小さな値が見つかったので、最小値を更新します。
  • secondmini が mini と異なり、かつ item の方が小さい場合: 2番目に小さい値を更新します。

この方法なら計算量は O(n) で済み、リストを並べ替える必要がないため効率的です。

sorted() を使った別の方法

よりシンプルに書きたい場合は、リストをソートしてから先頭と末尾の要素を参照する方法もあります。

B = sorted(A)
print("最大値 :", B[-1])
print("2番目に大きい値 :", B[-2])
print("最小値 :", B[0])
print("2番目に小さい値 :", B[1])

ただし、ソートには O(n log n) の計算量がかかるため、大量のデータを扱う場合は最初に紹介した1回のループで完結する方法が有利です。用途やデータサイズに応じて使い分けるとよいでしょう。

  1. Pythonで配列内の最大の要素を見つける方法を解説

    この記事では、「配列の中から最大の要素を求める」という問題の解決方法について詳しく解説します。 問題の概要 問題文:与えられた配列に対して、その中で最も大きい要素を計算して求める必要があります。 ここではブルートフォース(総当たり)アプローチを使用します。これは、配列全体を先頭から順番に走査しながら各要素を比較し、その時点での最大値を更新していくというシンプルかつ確実な手法です。 実装例 以下に具体的なコードを示します。 # 最大値を求める関数 def largest(arr, n): # 最大要素の初期値として最初の要素を設定 max = arr[0] # 配列全体を

  2. Pythonで配列内の最大要素を見つける方法【初心者向け解説】

    本記事では、配列の中から最大の要素を見つけるための解法とアプローチについて詳しく解説します。 問題の概要 配列が入力として与えられたとき、その中から最も大きい要素を見つけ出すことが課題となります。 アプローチ この問題は「線形探索」と呼ばれるシンプルな手法で解決できます。手順は以下の通りです。 まず、変数 max を配列の最初の要素で初期化します。 次に、2番目の要素から配列の末尾まで順番に走査していきます。 走査中の各要素について、現在の max の値と比較します。 要素が max より大きければ、max の値をその要素で更新します。 そうでなければ、そのまま次の要素へ進みます。 この処