1. ホーム
  2. python

[解決済み] コンパレータ関数によるソート

2022-03-02 12:56:26

質問

2つのタプルの特定の値を比較して、1つ目が2つ目より大きければ真を、そうでなければ偽を返す既存のコンパレータをいくつか使用しています。以下は、そのうちの1つのコードです。

def cmpValue(subInfo1, subInfo2):
    """
    Returns True if value in (value, work) tuple subInfo1 is GREATER than
    value in (value, work) tuple in subInfo2
    """
    # TODO...
    if subInfo1[0] > subInfo2[0]:
        return True
    else:
        return False

今、私は上で比較されているタイプのタプルのエントリを多数持つ辞書を持っています。それらをすべて逆順に並べ替えたいのですが、その方法がよくわかりません。私は次のようなことを考えていました。

sortedDict = sorted(subjects, key=comparator, reverse = True)

しかし、各コンパレータは2つの引数(subInfo1, subInfo2)を取るので、コンパレータに何を渡せばいいのかがわからない。 コンパレータの関数を変更することができません。

どうすればいいですか?

コンパレータを key 関数を使用します。として渡す必要があります。 cmp これを適切なコンパレータに変換する関数に包まれています。

def make_comparator(less_than):
    def compare(x, y):
        if less_than(x, y):
            return -1
        elif less_than(y, x):
            return 1
        else:
            return 0
    return compare

sortedDict = sorted(subjects, cmp=make_comparator(cmpValue), reverse=True)

(本当はキーファンクションを使うべきですが。

sorted(subjects, operator.itemgetter(0), reverse=True)

また、以下のことに注意してください。 sortedDict は実際には dict ということで、かなり紛らわしい名前になっています(笑)。