この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: min
SEOタイトル: Python min関数 完全ガイド(最小値取得 / リスト / key / default / max との比較)

この記事の要点
  • min() は引数の中から最小値を返す組み込み関数
  • 2 つの呼び方: min(a, b, c, ...) (複数引数) と min(iterable) (リスト等)
  • key 引数で比較基準を関数で指定可能。文字列長最小、辞書要素最小値、属性最小値など
  • default 引数で空のイテラブルに対するフォールバック値を指定 (ないと ValueError)
  • 対義語の max() と引数仕様は完全対称
  • 計算量は O(n) — 全要素を走査する。大量データで複数回呼ぶならソート併用も検討

min 関数とは

min は Python の組み込み関数のひとつで、与えられた引数の中から最小値を返します。数値・文字列・タプル・カスタムオブジェクトなど、比較可能な値であれば何でも使えます。

2 つの呼び方

呼び方構文
複数引数min(a, b, c, ...)min(3, 1, 4) → 1
イテラブルmin(iterable)min([3, 1, 4]) → 1

基本使用例

# 複数の数値から最小値
print(min(-20, -10, 0, 10, 20))   # -20
print(min(3, 1, 4, 1, 5, 9))      # 1

# リストから最小値
nums = [3, 1, 4, 1, 5, 9, 2, 6]
print(min(nums))                  # 1

# タプル・集合・range・ジェネレータも OK
print(min((10, 20, 5)))           # 5
print(min({3, 1, 2}))             # 1
print(min(range(10, 100, 10)))    # 10
print(min(x*x for x in [-3, 2, 1]))  # 1

文字列・辞書での挙動

# 文字列は辞書順比較
print(min("python"))              # 'h' (最小コードポイント)
print(min(["banana", "apple", "cherry"]))  # 'apple'

# 辞書はキーが対象
d = {"c": 30, "a": 10, "b": 20}
print(min(d))                     # 'a'
print(min(d.values()))            # 10
print(min(d.items()))             # ('a', 10) -- タプル比較

key 引数: 比較基準を指定

# 文字列の長さが最小のもの
words = ["banana", "apple", "kiwi", "pineapple"]
print(min(words, key=len))            # 'kiwi'

# 絶対値が最小のもの
nums = [-10, 3, -1, 7, -5]
print(min(nums, key=abs))             # -1

# 辞書のキー
d = {"c": 30, "a": 10, "b": 20}
print(min(d, key=d.get))              # 'a'  (値が最小のキー)

# オブジェクトの属性
people = [
    {"name": "Alice", "age": 30},
    {"name": "Bob",   "age": 25},
    {"name": "Carol", "age": 28},
]
youngest = min(people, key=lambda p: p["age"])
print(youngest)  # {'name': 'Bob', 'age': 25}

# operator.itemgetter / attrgetter で関数化
from operator import itemgetter
youngest = min(people, key=itemgetter("age"))

default 引数: 空対策

# 空のイテラブルに min() を直接呼ぶと ValueError
try:
    min([])
except ValueError as e:
    print(e)  # min() arg is an empty sequence

# default 引数でフォールバック
print(min([], default=0))                 # 0
print(min([], default="N/A"))             # 'N/A'

# 検索結果が空でもエラーにしない実用例
results = []
best = min(results, key=lambda r: r.score, default=None)
if best is None:
    print("結果なし")

複数引数 vs イテラブル: 注意点

# OK: 複数引数で渡す
print(min(3, 1, 4))         # 1

# OK: イテラブル一つを渡す
print(min([3, 1, 4]))       # 1

# NG: 複数引数とイテラブルを混在
# print(min([3, 1], 4))     # TypeError

# 複数引数のとき default は使えない
# print(min(3, 1, default=0))  # TypeError

カスタムオブジェクトとの併用

# __lt__ を実装すれば min() が使える
class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price
    def __lt__(self, other):
        return self.price < other.price
    def __repr__(self):
        return f"{self.name}(¥{self.price})"

items = [
    Product("コーヒー", 500),
    Product("ティー",   300),
    Product("ジュース", 400),
]
print(min(items))  # ティー(¥300)

# key で指定すれば __lt__ なしでも OK
items2 = [
    {"name": "コーヒー", "price": 500},
    {"name": "ティー",   "price": 300},
]
print(min(items2, key=lambda x: x["price"]))

応用パターン

複数リストの要素比較

# 同じインデックスごとの最小値リスト
a = [1, 5, 3]
b = [4, 2, 6]
mins = [min(x, y) for x, y in zip(a, b)]
print(mins)   # [1, 2, 3]

# あるいは map で
print(list(map(min, a, b)))  # [1, 2, 3]

下限値クリップ

# 値を上限内に収める「下限はある値」というクリップ
def clamp(value, lo, hi):
    return min(max(value, lo), hi)

print(clamp(150, 0, 100))   # 100
print(clamp(-50, 0, 100))   # 0
print(clamp(42, 0, 100))    # 42

同点時の挙動

# key で同じ値が複数あるとき、Python は安定で「最初に出現したもの」を返す
words = ["pie", "bat", "cap", "dog"]
print(min(words, key=len))   # 'pie' (3文字の最初)

パフォーマンス

  • 計算量は O(n) — 全要素を 1 回ずつ見る
  • 同じデータに対して min と max を別々に呼ぶと 2 回走査になる。1 回で済ませたいなら numpy や手書きループを検討
  • 大量データを繰り返し min するなら、ソートしておくほうが速い (ただし最初のソート O(n log n))

min 関数の設計思想と Python らしい使い方

Python の組み込み関数 min は、シンプルな API の中に強力な柔軟性を備えた典型的な Python らしい関数です。「最小値を返す」というだけの説明から、複数引数とイテラブル引数の二刀流、key 引数による比較基準のカスタマイズ、default 引数による空対応まで、ありとあらゆるユースケースを単一の関数でカバーしています。これは Python が掲げる「There should be one obvious way to do it(明白な方法がひとつあるべき)」の哲学を象徴する設計です。

実装の現場では、辞書やオブジェクトのリストから特定の属性で最小値を選ぶケースが圧倒的に多く、key 引数を使いこなせるかどうかが Python 力の試金石といっても過言ではありません。lambda で短く書く方法、operator.itemgetter / operator.attrgetter で関数化する方法を使い分けると、コードの可読性と性能の両方を最適化できます。

min を使ったアルゴリズム表現のコツ

min は単独で使うだけでなく、より大きなアルゴリズムの中に組み込むと表現力が増します。たとえば「上限と下限の間に値を収める clamp 関数」は min(max(value, lo), hi) という 1 行で書け、ロジックの意図がストレートに読み取れます。「複数のリストから同じインデックスごとの最小値を取る」のは zipmap と組み合わせるだけで実現でき、ループを書かずに済むためバグを減らせます。

また、関数型プログラミングの考え方を持ち込むと、reducefunctools と組み合わせて多段階の集計処理を書くこともできます。たとえば、複数の条件で順次絞り込みを行いながら最終的に最小値を取り出すような処理も、minkey 引数とジェネレータ式を組み合わせれば 1 つの式で表現可能です。「ループを書かずに最小値を求める」という発想を身につけると、Python のコード量がぐっと減り、可読性も大幅に上がります。

min 関数を使った実務での頻出シナリオ

実務で min を使う場面は、想像以上に幅広くあります。たとえば EC サイトの商品一覧で「最安値の商品を取得する」「在庫数が最少の商品を抽出する」「次回入荷予定日が最も早い商品を選ぶ」といった処理は、すべて min と key 引数の組み合わせで一発で書けます。これらをループで書くと数行〜十数行になりますが、min(products, key=lambda p: p.price) なら 1 行で意図が伝わるため、コードレビューもスムーズに進みます。

また、データ分析やレポート生成の業務でも min は頻出です。複数のセンサーから取得した数値の中で最小値を選ぶ、複数の機械学習モデルの中で誤差が最も小さいものを選ぶ、複数の経路から最短距離を選ぶ、といった処理が典型例です。default 引数を組み合わせると、データが空でも安全に処理を継続でき、特殊な条件分岐を書かずに済みます。シンプルな関数ですが、適切に使いこなすとコードの簡潔さと安全性が同時に手に入ります。

min 関数を学ぶ際の注意点

min は強力な反面、使い方を誤ると分かりにくいバグを引き起こすこともあります。よくある落とし穴は、ジェネレータを min に渡したあと、同じジェネレータを別の処理で再利用しようとして空になっている、というケースです。ジェネレータは一度走査すると消費されるため、再利用したい場合は list() で材料化してから min に渡すか、ジェネレータを生成する関数自体を再度呼ぶ必要があります。

もうひとつは、Python 3 における異種型混在の比較禁止です。Python 2 までは int と str を min に渡しても暗黙的な比較が走り、想定外の結果になることがありました。Python 3 では TypeError でしっかりエラーが出るため、混在の事故は減りましたが、辞書のキーが文字列と数値の混在になっているような場面では今でも注意が必要です。key 引数で型を統一する変換を挟むのが安全策です。これらの細かな挙動を理解しておくと、min を含む集計処理の堅牢性が一段高まります。

また、numpy や pandas の登場により大量データに対する最小値計算は専用ライブラリのほうが圧倒的に速いため、数百万件規模のデータを扱う場面では numpy.minDataFrame.min() の利用を検討する価値があります。組み込み min は汎用性と柔軟性に優れ、numpy は速度に優れる、という棲み分けを理解しておくと、ユースケースに応じた使い分けがスムーズになります。日常的なリスト操作は組み込み min、数値計算の重い処理は numpy、と整理して覚えておくのがおすすめです。

max 関数との対称性

項目min()max()
返り値最小値最大値
複数引数
イテラブル引数
key 引数
default 引数○ (3.4+)○ (3.4+)

FAQ

Q: 同じ最小値が複数あるとき、どれが返る?
A: 最初に出現した要素min は「より小さい」場合のみ更新するので安定。

Q: 比較不可能な型を混ぜると?
A: TypeError。Python 3 では min(1, "a") はエラー。Python 2 では暗黙比較されていた。

Q: NaN を含むと?
A: 結果は不定。NaN 同士の比較は False になるので、データに NaN がある場合は事前に除外推奨。

Q: ジェネレータを 2 回 min できる?
A: 1 回で使い切るので 2 回目は空になる。list() 化してから複数回使うか、関数で再生成する。

Q: min(a, b)a if a < b else b どちらが速い?
A: 2 要素なら三項演算子のほうが若干速い (関数呼び出しコストがない)。3 要素以上や key 引数を使うなら min() が圧倒的に読みやすく速い。

関連記事