Использование функции компаратора для сортировки
Итак, я работаю с несколькими ранее существовавшими компараторами, которые сравнивают определенные значения в двух кортежах и возвращают 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
, поэтому имя довольно запутанно.)