124просмотров
2 августа 2023 г.
Score: 136
Использование параметра cmp Все версии Python 2.x поддерживали параметр cmp для обработки пользовательских функций сравнения. В Python 3.0 от этого параметра полностью избавились. В Python 2.x в sort() можно было передать функцию, которая использовалась бы для сравнения элементов. Она должна принимать два аргумента и возвращать отрицательное значение для случая «меньше чем», положительное — для «больше чем» и ноль, если они равны: >>> def numeric_compare(x, y): return x - y
>>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)
[1, 2, 3, 4, 5] Можно сравнивать в обратном порядке: >>> def reverse_numeric(x, y): return y - x
>>> sorted([5, 2, 4, 1, 3], cmp=reverse_numeric)
[5, 4, 3, 2, 1] При портировании кода с версии 2.x на 3.x может возникнуть ситуация, когда нужно преобразовать пользовательскую функцию для сравнения в функцию-ключ. Следующая обёртка упрощает эту задачу: def cmp_to_key(mycmp): 'Перевести cmp=функция в key=функция' class K(object): def init(self, obj, *args): self.obj = obj def lt(self, other): return mycmp(self.obj, other.obj) < 0 def gt(self, other): return mycmp(self.obj, other.obj) > 0 def eq(self, other): return mycmp(self.obj, other.obj) == 0 def le(self, other): return mycmp(self.obj, other.obj) <= 0 def ge(self, other): return mycmp(self.obj, other.obj) >= 0 def ne(self, other): return mycmp(self.obj, other.obj) != 0 return K Чтобы произвести преобразование, оберните старую функцию: >>> sorted([5, 2, 4, 1, 3], key=cmp_to_key(reverse_numeric))
[5, 4, 3, 2, 1] В Python 2.7 функция cmp_to_key() была добавлена в модуль functools. IT Аналитика