Использование функции компаратора для сортировки

Итак, я работаю с несколькими ранее существовавшими компараторами, которые сравнивают определенные значения в двух кортежах и возвращают true, если первое больше второго, а false - в противном случае. Здесь код для одного из них:

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)

Но я не знаю, что передать в компаратор, потому что каждый компаратор принимает два аргумента (subInfo1, subInfo2). Я не могу изменить функции компаратора.

Ответы

Ответ 1

Вы передаете компаратор как функцию 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, поэтому имя довольно запутанно.)