Pythonで整数リストから3番目に大きい数を見つける方法
整数のリストから3番目に大きい数を求めたい場面は、アルゴリズムの学習や実務のデータ処理においてよくあります。本記事では、リストを引数として受け取る関数を定義し、負の無限大(float('-inf'))を初期値とした3つのスロットを使って、効率的に3番目に大きい値を特定する方法を解説します。
アルゴリズムの考え方
基本的なアプローチは次のとおりです。
- 上位3つの値を保持するためのリストを、負の無限大3つで初期化します。
- 元のリストの各要素を順に走査し、既存の上位3つの値と比較します。
- 重複する値はスキップし、より大きい値が見つかるたびにスロットを更新します。
- 最終的に負の無限大が残っている場合(=異なる値が3つ存在しない場合)は、リストの最大値を代わりに出力します。
サンプルコード
以下に具体的な実装例を示します。
def third_max_num(my_num):
my_result = [float('-inf'), float('-inf'), float('-inf')]
for num in my_num:
if num not in my_result:
if num > my_result[0]: my_result = [num, my_result[0], my_result[1]]
elif num > my_result[1]: my_result = [my_result[0], num, my_result[1]]
elif num > my_result[2]: my_result = [my_result[0], my_result[1], num]
if float('-inf') in my_result:
print(max(my_num))
else:
print(my_result[2])
my_list = [45, 31, 78, 9, 0, 54, 12, 18]
print("The list is :")
print(my_list)
print("The third maximum number is :")
third_max_num(my_list)
実行結果
The list is : [45, 31, 78, 9, 0, 54, 12, 18] The third maximum number is : 45
この例では、リスト内の最大値は78、2番目は54、そして3番目に大きい値は45であるため、正しく45が出力されています。
コードの詳細な解説
third_max_numという名前の関数を定義し、整数のリストを引数として受け取ります。負の無限大の浮動小数点数3つからなるリスト
my_resultを用意し、これが上位3つの値を格納する「スロット」として機能します。元のリストの各要素について、すでに
my_resultに存在しない場合のみ比較を行います。これにより重複した値が誤ってカウントされるのを防ぎます。要素が現在の最大値より大きければ、リスト全体をシフトして新しい最大値を挿入します。同様の処理を2番目・3番目のスロットに対しても
elifで順に判定します。ループ終了後、
my_resultにまだ負の無限大が残っている場合は、異なる値が3つ揃わなかったことを意味するため、代わりにリスト全体の最大値(max(my_num))を出力します。関数の外では対象となるリストを定義してコンソールに表示し、そのリストを引数として関数を呼び出します。
最終的な結果がコンソールに出力されます。
補足:より簡潔な代替手法
要素数が少ないリストであれば、setとsortedを組み合わせた次のような書き方も可能です。
def third_max_simple(my_num): unique_nums = sorted(set(my_num), reverse=True) return unique_nums[2] if len(unique_nums) >= 3 else max(unique_nums)
こちらはコードが簡潔になる一方、ソートにO(n log n)のコストがかかります。前述の手法はリストを一度だけ走査すればよいため、大きなデータセットではO(n)で処理できるという利点があります。用途やデータ規模に応じて使い分けるとよいでしょう。
-
Pythonでリスト内の最小値を見つける方法を解説
この記事では、リストの中から最小の数値を見つける方法について、具体的なサンプルコードとともに詳しく解説します。問題の概要問題: 数値のリストが与えられたとき、その中に含まれる最も小さい数値を画面に表示すること。この問題を解くアプローチは主に2つあります。ひとつは sort() メソッドを使ってリストを昇順に並べ替え、先頭の要素(インデックス0)を取得する方法。もうひとつは、Pythonに標準で用意されている組み込み関数 min() を使う方法です。それぞれ順番に見ていきましょう。方法1:sort()メソッドで並べ替えて最小値を取得するまずはリストを昇順にソートし、先頭の要素を取り出す方法です。
-
Pythonのリストから最大値を取得する方法|max()関数の使い方を解説
Pythonで最大値を見つけるには?Pythonには、リストなどのイテラブル(反復可能なオブジェクト)の中から最大の数値を簡単に取り出すための組み込み関数 max() が用意されています。この関数は、カンマ区切りで渡した複数の数値、あるいはリスト・タプルなどのコレクションを引数に受け取ることができます。基本的な使い方まず、複数の数値を直接引数として渡す例を見てみましょう。>>> max(10, 23, 43, 21) 43このように、max() に数値をカンマ区切りで渡すと、その中で最も大きい値である 43 が返されます。リストから最大値を取得する次に、リストを引数として渡す