Python | データ構造:min

Python
スポンサーリンク

概要(min は「一番小さいもの」を返す基本関数)

min は、与えた複数の値や、リスト・タプル・集合などのイテラブルの中から「最小の要素」を返す組み込み関数です。数値だけでなく文字列やタプルなど“比較可能”なものに使えます。複数の引数を並べても、イテラブルをひとつ渡しても動作します。

print(min(5, 2, 8, 1))     # 1
print(min([10, 20, 5]))    # 5
print(min("banana"))       # 'a'(文字列は辞書順で比較)
Python

基本構文と引数(ここが重要)

形式は2通り(複数引数/イテラブル)

複数の値を並べる書き方と、イテラブル(リストなど)をひとつ渡す書き方があります。返り値は「最小の要素」です。

print(min(3, 7, 2))   # 2
nums = [3, 7, 2]
print(min(nums))      # 2
Python

key で「比較基準」を指定できる

key=関数 を渡すと、各要素に対して「比較に使う基準値」を計算し、その値で大小判定します。柔軟で強力なので必ず押さえてください。

words = ["tea", "espresso", "latte"]
print(min(words, key=len))       # 'tea'(文字数が最小)

items = [("coffee", 350), ("tea", 280), ("juice", 220)]
print(min(items, key=lambda x: x[1]))  # ('juice', 220)(価格が最小)
Python

default で「空のときの戻り値」を決められる

空のイテラブルを渡すと通常は ValueError になりますが、default=値 を指定するとその値が返ります。欠損があり得る場面で安全に書けます。

empty = []
print(min(empty, default=None))  # None(エラー回避)
Python

データ型ごとの挙動(数値・文字列・辞書)

数値の最小値(基本だが頻出)

センサ値、点数、価格など“最小”の取得に使います。

scores = [70, 85, 90]
print(min(scores))  # 70
Python

文字列の最小値(辞書順)

文字列は“辞書順”(Unicodeのコードポイント順)で比較されます。大小無視にしたいときは key=str.casefold を使います。

names = ["taro", "Hanako", "JIRO"]
print(min(names))                    # 'Hanako'(辞書順で最小)
print(min(names, key=str.casefold))  # 'Hanako'(大小無視でも最小)
Python

辞書の最小値(キー/値で選ぶ)

そのまま min(d) は「最小のキー」を返します。値で判定したいなら items() と key を使います。

prices = {"coffee": 350, "tea": 280, "juice": 220}
print(min(prices))                               # 'coffee'(キーの辞書順で最小)
print(min(prices.items(), key=lambda kv: kv[1])) # ('juice', 220)
Python

重要ポイントの深掘り(複合キー・比較不能・性能)

複合条件はタプルキーが簡潔

複数条件で比較したいときは、key がタプル(第一条件, 第二条件, …)を返す形にします。辞書順で順に比較され、タイブレークが自然に書けます。

products = [
    {"name": "coffee", "price": 350},
    {"name": "tea",    "price": 350},
    {"name": "juice",  "price": 220},
]
cheapest = min(products, key=lambda p: (p["price"], p["name"]))
print(cheapest)  # {'name': 'juice', 'price': 220}
Python

比較できない型の混在は TypeError

数値と文字列など“比較不能な型”が混ざっているとエラーになります。事前に型を揃えるか、key で比較対象を統一します。

data = ["10", 2, "30"]
# print(min(data))              # TypeError
print(min(data, key=str))       # '10'(文字列として比較)
Python

key が重い処理なら「一度だけ計算」する

min は比較のために key 関数を複数回呼びます。高コスト計算なら、先に基準値を添えてから一度の比較で済ませる(“装飾してから剥がす”)と効率的です。

files = ["file2.txt", "file10.txt", "file1.txt"]
decorated = [(int(f[4:-4]), f) for f in files]  # 数値部分を先に抽出
print(min(decorated)[1])  # 'file1.txt'
Python

よくある落とし穴と安全策

空イテラブルでの ValueError

min([]) はエラーになります。欠損があり得るなら default を使うか、事前に空チェックをします。

items = []
print(min(items, default="N/A"))  # 'N/A'
Python

“falsy”値は有効な比較値

key の結果が 0 や “” といった falsy でも「有効な比較値」です。or で置換せず、そのまま比較に使いましょう。

texts = ["", "a", "ab"]
print(min(texts, key=len))  # ''(長さ0が最小)
Python

文字列の“読み順”と辞書順のズレ

辞書順は人間の“読み順”と異なる場合があります。日本語や大小無視が必要なら、正規化(ひらがな化、casefold)を key に組み込みます。

names = ["アップル", "あさ", "バナナ"]
# 要件に応じた正規化関数を key に適用する
Python

例題で身につける(定番から一歩先まで)

例題1:最も短い単語を取る

words = ["tea", "espresso", "latte"]
print(min(words, key=len))  # 'tea'
Python

例題2:価格が最小の商品(辞書)

products = [
    {"name": "coffee", "price": 350},
    {"name": "tea",    "price": 280},
    {"name": "juice",  "price": 220},
]
print(min(products, key=lambda p: p["price"]))  # {'name': 'juice', 'price': 220}
Python

例題3:複合条件で最小(価格→在庫)

items = [
    {"name": "A", "price": 300, "qty": 2},
    {"name": "B", "price": 300, "qty": 5},
    {"name": "C", "price": 250, "qty": 10},
]
print(min(items, key=lambda x: (x["price"], x["qty"])))  # C
Python

例題4:空を安全に扱う(default)

nums = []
print(min(nums, default=None))  # None(エラー回避)
Python

応用パターン(min を活かした便利な使い方)

ネスト構造から最小値を取り出す

辞書やリストの中にさらに辞書がある場合でも、key を指定すれば柔軟に最小値を取得できます。

store = {
    "coffee": {"price": 350, "qty": 2},
    "tea":    {"price": 280, "qty": 1},
    "juice":  {"price": 220, "qty": 3},
}
cheapest = min(store.items(), key=lambda kv: kv[1]["price"])
print(cheapest)  # ('juice', {'price': 220, 'qty': 3})
Python

日付や時刻の最小値

datetime オブジェクトも比較可能なので、最も古い日付や時刻を簡単に求められます。

import datetime
dates = [
    datetime.date(2025, 12, 13),
    datetime.date(2024, 5, 1),
    datetime.date(2026, 1, 1),
]
print(min(dates))  # 2024-05-01
Python

文字列の長さや条件で最小を選ぶ

文字列の「長さ」や「特定条件」を基準に最小を選べます。

words = ["python", "ai", "data", "science"]
shortest = min(words, key=len)
print(shortest)  # 'ai'
Python

性能と設計の考え方

計算量は O(n)

min は全要素を走査して最小値を探すため、要素数に比例した時間がかかります。数百万件規模でも Python の組み込み関数は最適化されているので十分高速ですが、繰り返し呼び出す場合は一度結果を保存して使う方が効率的です。

key 関数のコストに注意

比較基準を計算する key 関数が重い処理だと、要素数 × 呼び出し回数分のコストがかかります。事前に基準値を計算しておく「装飾してから剥がす」テクニックが有効です。


さらに踏み込んだ例題

例題5:最も在庫が少ない商品を探す

items = [
    {"name": "A", "price": 300, "qty": 2},
    {"name": "B", "price": 280, "qty": 5},
    {"name": "C", "price": 250, "qty": 1},
]
low_stock = min(items, key=lambda x: x["qty"])
print(low_stock)  # {'name': 'C', 'price': 250, 'qty': 1}
Python

例題6:複合条件で最小を選ぶ(価格→名前)

products = [
    {"name": "coffee", "price": 350},
    {"name": "tea",    "price": 350},
    {"name": "juice",  "price": 220},
]
cheapest = min(products, key=lambda p: (p["price"], p["name"]))
print(cheapest)  # {'name': 'juice', 'price': 220}
Python

例題7:空リストを安全に扱う

nums = []
print(min(nums, default="データなし"))  # 'データなし'
Python

まとめ

min は「最小の要素」を返す基本関数で、数値・文字列・辞書・日付など幅広く使えます。

  • 複数引数でもイテラブルでも利用可能
  • key で比較基準を柔軟に指定できる
  • default で空のケースを安全に処理できる
  • 複合条件はタプルキーで簡潔に書ける

性能は O(n) ですが、組み込み関数として最適化されているため実務でも安心して使えます。初心者が「最大値は max、最小値は min」とセットで覚えると、データ処理の幅がぐっと広がります。

タイトルとURLをコピーしました