Pythonで最大・最小の要素を取得する方法まとめ!min/max・heapq・pandasの使い分けを解説
この記事では、Pythonを使ってデータの中から最大または最小の要素を効率的に見つけたい開発者に向けて、いくつかの方法を紹介し、それぞれの使い分けのポイントまで解説します。
方法1:リストに対するソート+スライス
単純に1つだけの最小値や最大値(N=1)を求めたい場合は、組み込み関数のmin()とmax()を使うのが最も高速です。
まずはランダムな整数のリストを生成してみましょう。
import random
# ランダムな整数のリストを作成
random_list = random.sample(range(1, 10), 9)
random_list
出力結果
[2, 4, 5, 1, 7, 9, 6, 8, 3]
最小値・最大値を1つだけ取得する場合(N=1)
# 最小値を取得(N=1)
min(random_list)
出力結果
1
# 最大値を取得(N=1)
max(random_list)
出力結果
9
最小・最大の3件を取得する場合(N=3)
Nがコレクション全体のサイズと同程度になる場合は、先にソートしてから先頭(または末尾)のN件をスライスで取り出す方が一般的に高速です。
# スライスで最小3件を取得(N=3)
sorted(random_list)[:3]
出力結果
[1, 2, 3]
# スライスで最大3件を取得(N=3)
sorted(random_list)[-3:]
出力結果
[7, 8, 9]
方法2:heapqモジュールを使う
標準ライブラリのheapqモジュールには、nlargest()とnsmallest()という2つの関数が用意されており、これらを使うと最大・最小のN個の要素を簡単に取得できます。
import heapq
import random
random_list = random.sample(range(1, 10), 9)
# 最小3件を取得(N=3)
heapq.nsmallest(3, random_list)
出力結果
[1, 2, 3]
# 最大3件を取得(N=3)
heapq.nlargest(3, random_list)
出力結果
[9, 8, 7]
より複雑なデータ構造を扱う場合は、keyパラメータを指定することで柔軟に対応できます。例えば、辞書の特定のキーを基準に並べ替えることが可能です。
import heapq
grandslams = [
{'name': 'Roger Federer', 'titles': 20},
{'name': 'Rafael Nadal', 'titles': 19},
{'name': 'Novak Djokovic', 'titles': 17},
{'name': 'Andy Murray', 'titles': 3},
]
# タイトル数が少ない選手トップ3(N=3)
less = heapq.nsmallest(3, grandslams, key=lambda s: s['titles'])
less
出力結果
[{'name': 'Andy Murray', 'titles': 3},
{'name': 'Novak Djokovic', 'titles': 17},
{'name': 'Rafael Nadal', 'titles': 19}]# タイトル数が多い選手トップ3(N=3)
more = heapq.nlargest(3, grandslams, key=lambda s: s['titles'])
more
出力結果
[{'name': 'Roger Federer', 'titles': 20},
{'name': 'Rafael Nadal', 'titles': 19},
{'name': 'Novak Djokovic', 'titles': 17}]DataFrameから最大・最小のN件を取得する
実務ではCSVファイルを読み込んでpandasのDataFrameとして扱う場面も多くありますよね。ここでは、DataFrameから最大・最小のN件を取得する2つの方法を紹介します。
まずはsort_values()メソッドで値をソートし、head()メソッドで先頭行を取り出す方法です。
import pandas as pd
import io
# データを定義
data = """
player,titles
Djokovic,17
Nadal,19
Federer,20
Murray,3
"""
throwaway_storage = io.StringIO(data)
df = pd.read_csv(throwaway_storage, index_col="player")
# 最小3件を取得(N=3)
df.sort_values("titles").head(3)
出力結果
titles
player
Murray 3
Djokovic 17
Nadal 19
# 最大3件を取得(N=3)
df.sort_values("titles", ascending=False).head(3)
出力結果
titles
player
Federer 20
Nadal 19
Djokovic 17
また、ソートしてhead()を呼び出す代わりに、.nsmallest()と.nlargest()メソッドを直接呼び出すこともできます。
df.nsmallest(3, columns="titles")
出力結果
titles
player
Murray 3
Djokovic 17
Nadal 19
df.nlargest(3, columns="titles")
出力結果
titles
player
Federer 20
Nadal 19
Djokovic 17
まとめ
比較的少数の要素を取得したい場合は、nlargest()とnsmallest()関数が最適です。
単純に1つの最小値または最大値(N=1)だけが必要な場合は、min()とmax()を使う方が高速です。
逆に、Nがコレクション全体のサイズとほぼ同じ場合は、先にソートしてスライスで切り出す方が効率的です。
実際のところ、nlargest()とnsmallest()の内部実装は適応的に動作するよう設計されており、Python側がこうした最適化の一部を自動的に行ってくれます。
-
Windows 10で容量の大きいファイルを簡単に見つける4つの方法
パソコンの動作が遅くなったり、正常に動かなくなったりする原因のひとつが、ディスク容量の不足です。こうした場合は、ディスク上にある大容量ファイルを見つけて、別のストレージへ移動するか削除することで、空き容量を確保しましょう。 関連記事: ディスククリーンアップを実行して空き容量を増やす方法 フォルダをひとつずつ手作業で開いて大きなファイルを探すのは、時間も労力もかかり非効率です。そこで本記事では、システム内の大容量ファイルを簡単かつ効率的に見つけるための方法を、初心者の方にもわかりやすく解説します。 ステップ1:よく使うフォルダのサイズを確認する まずは、普段ファイルを保存しているフォルダ(
-
Windows 10で大容量ファイルを簡単に見つける方法|ストレージ不足を解消する3つの手法
「ストレージの空き領域が不足しています」という警告が表示され、空き容量を確保するのに苦労していませんか?そのようなときに最も効果的なのが、Windows 10の中にある大容量ファイルを特定することです。どのファイルが不要なのかを正確に把握できれば、それらを削除してストレージ容量を回復できます。 では、PC上の大きなファイルはどうやって探せばよいのでしょうか? 実は、Windows 10で大容量ファイルを見つける方法はいくつかあります。標準搭載のツールを使う方法と、「Disk Analyzer Pro」のようなサードパーティ製アプリを使う方法です。Disk Analyzer Proなら、あっとい