我正在将一堆 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 的更惯用的方式?
最佳答案
作为权宜之计,我认为这很好。
如果您有 custom_compare
和 custom_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 的排序的 secret 行为。
从长远来看,我会考虑重写自定义比较函数,以便它们不需要 cmp_to_key
处理;在大多数情况下,这应该是微不足道的。
关于python - 将自定义比较与 python 3 中的键选择相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50104225/