50

そのため、2 つのタプルの特定の値を比較し、最初の値が 2 番目の値よりも大きい場合は true を返し、そうでない場合は false を返す既存のコンパレータをいくつか使用しています。それらの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) を取るため、コンパレーターに何を渡せばよいかわかりません。コンパレータ機能を変更できません。

4

4 に答える 4

55

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ため、名前がかなり紛らわしいです。)

于 2012-10-05T15:31:42.157 に答える