Python | データ構造:max

Python
スポンサーリンク

概要(max は「一番大きいもの」を返す基本関数)

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

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

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

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

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

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

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

key=関数 を渡すと、各要素に対して「並べ替えや比較に使う基準値」を計算して、その値で大小判定します。柔軟で強力なので、必ず押さえておくべきポイントです。

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

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

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

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

empty = []
print(max(empty, default=None))  # None(エラーを避ける)
Python

数値・文字列・辞書での使い方(具体例で理解する)

数値の最大値(単純だが頻出)

センサ値、点数、価格などの“最大”を一発で取れます。合計や平均と組み合わせるのが実務の定番です。

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

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

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

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

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

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

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

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

「複合条件」はタプルを返す key が簡潔

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

products = [
    {"name": "coffee", "price": 350},
    {"name": "tea",    "price": 350},
    {"name": "juice",  "price": 220},
]
best = max(products, key=lambda p: (p["price"], p["name"]))
print(best)  # 価格最大、同価格なら名前で最大 → {'name': 'tea', 'price': 350}
Python

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

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

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

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

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

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

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

空イテラブルでの ValueError

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

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

“falsy”値を既定値と誤解しない

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

texts = ["", "a", "ab"]
print(max(texts, key=len))  # 'ab'(長さの比較)
Python

文字列の“見た目”と辞書順のズレ

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

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

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

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

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

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

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

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

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

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

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

まとめ

max は「最大の要素」を返す基本関数で、複数引数にもイテラブルにも対応します。key で比較基準を柔軟に設計でき、複合条件は“タプルキー”が簡潔。空の可能性があるなら default を活用し、型混在による比較不能や重い key の過剰評価に注意しましょう。これらを押さえれば、数値・文字列・辞書・ファイル名など、あらゆる“最大”を安全かつシンプルに見つけられます。

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