Объединение пользовательского сравнения с выбором ключа в Python 3 - PullRequest
0 голосов
/ 30 апреля 2018

Я перевожу кучу кода Python 2.7 в Python 3 с такими шаблонами в Python 2.7:

sorted(some_list, cmp=custom_compare, key=custom_key_getter)

Лучший способ понять, как это сделать, был следующим:

sorted(some_list, 
       key=functools.cmp_to_key(
             lambda x,y: custom_compare(custom_key_getter(x), 
                                        custom_key_getter(y)))

Есть ли лучший способ? Или более идиоматический способ, соответствующий Python 3?

1 Ответ

0 голосов
/ 30 апреля 2018

Как временное решение, я думаю, что все в порядке.

Если у вас есть несколько комбинаций custom_compare и custom_key_getter, я бы выделил лямбду как

def compare_using(custom_compare, custom_key_getter):
   def comparator(x, y):
     return custom_compare(custom_key_getter(x), custom_key_getter(y))
   return comparator

Если у вас есть только несколько комбинаций, я могу представить, что они будут предварительно вычислены, например,

compare_names_special = compare_using(compare_special, itemgetter('name'))
...
customers_by_name = sorted(customers, compare_names_special)

Производительность не должна быть затронута, потому что этот код просто показывает, что сортировка Python 2 все равно делала в тайне.

В более долгосрочной перспективе я хотел бы переписать пользовательские функции сравнения, чтобы они не нуждались в обработке cmp_to_key; в большинстве случаев это должно быть тривиально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...