0Pricing
Competitive Programming Academy · レッスン

functools.cmp_to_key によるカスタム順序

キーでは足りないときに比較関数を書きます

「functools.cmp_to_key によるカスタム順序」はCoddyKit上の無料Competitive Programming Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCompetitive Programming Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Competitive Programming Academyコースには全4レッスンが含まれています。

key では表現できないとき

1 つの値だけでなく、2 つの要素を組み合わせて比較しなければ決まらない順序もあります。その場合は key ではなく比較関数を書きます。

比較関数の戻り値

比較関数は 2 つの要素 a と b を受け取ります。a を先にする場合は負の数、b を先にする場合は正の数、同順位の場合は 0 を返します。

def cmp(a, b):
    if a < b: return -1
    if a > b: return 1
    return 0

cmp_to_key で橋渡しする

Python の sort は key しか受け取らないため、functools.cmp_to_keyで比較関数をラップし、使用できる key に変換します。

from functools import cmp_to_key
items.sort(key=cmp_to_key(cmp))

典型的な最大数問題

数値を連結して最大の文字列を作るには、どちらの連結結果が大きいかでペアを比較します。通常の key ではこの条件を表現できません。

def cmp(a, b):
    return (a + b < b + a) - (a + b > b + a)

比較の仕組みを読み解く

a+bのほうが大きな連結結果になるとき、この式は -1 を返すため、a が b より前に並びます。これによって、作れる中で最大の数が構成されます。

nums = ["3", "30", "34"]
nums.sort(key=cmp_to_key(cmp))
print("".join(nums))   # 34330

重要なのは符号

ソートが見るのは戻り値の符号だけです。-2 や -100 を返しても -1 と同じように扱われるため、絶対値を正確にする必要はありません。

比較関数に一貫性を持たせる

比較関数には一貫性が必要です。a が b より優先され、b が c より優先されるなら、a は c よりも優先されなければなりません。矛盾があると順序が壊れます。

可能なら key を優先する

keyは要素ごとに 1 回計算されますが、比較関数は多くのペアに対して実行されるため遅くなります。key で表現できない場合にだけ cmp_to_key を使ってください。

減算による簡略化

数値の比較では、a - bをそのまま返せます。符号がすでに順序を表しているためです。整数であれば、短く安全に書けます。

items.sort(key=cmp_to_key(lambda a, b: a - b))

浮動小数点数に注意

浮動小数点数では、a - bが非常に小さい値や 0 に丸められることがあります。誤って同順位と判定しないよう、明示的な分岐で比較してください。

比較関数で独自の順序を実現する

連結の順序、独自の順位付け、ルールに基づく同順位の解消などが可能になります。比較関数は、複雑なソートに対応するための切り札です。

確認問題

比較関数は cmp(a, b) に対して負の数を返します。

まとめ

key では表現できない順序には、比較関数を cmp_to_key でラップして対応できます。符号を返し、一貫性を保ち、可能な場合は key を優先してください。🧩

よくある質問

「functools.cmp_to_key によるカスタム順序」レッスンは無料ですか?

はい。「functools.cmp_to_key によるカスタム順序」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Competitive Programming Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Competitive Programming Academyコースには全4レッスンが含まれています。

「functools.cmp_to_key によるカスタム順序」で何を学びますか?

キーでは足りないときに比較関数を書きます ブラウザで直接実行するハンズオンコードでCompetitive Programming Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Competitive Programming Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCompetitive Programming Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「functools.cmp_to_key によるカスタム順序」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCompetitive Programming Academyレッスンでコードを書いて実行できますか?

はい。すべてのCompetitive Programming Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. sorted() と key 関数
  2. 複数のフィールドでソートする
  3. functools.cmp_to_key によるカスタム順序
  4. 先にソートすると解決策が見つかる理由
← Competitive Programming Academyに戻る