将自定义比较与python 3

时间:2018-04-30 16:04:37

标签: python python-3.x python-2.7 sorting

我正在将一堆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 :(得分:2)

作为权宜之计的解决方案,我认为没关系。

如果您有多个custom_comparecustom_key_getter的组合,我会将lambda分解为

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处理;在大多数情况下,它应该是微不足道的。