python - 将自定义比较与 python 3 中的键选择相结合

标签 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 的更惯用的方式?

最佳答案

作为权宜之计,我认为这很好。

如果您有 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 的排序的 secret 行为。

从长远来看,我会考虑重写自定义比较函数,以便它们不需要 cmp_to_key 处理;在大多数情况下,这应该是微不足道的。

关于python - 将自定义比较与 python 3 中的键选择相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50104225/

相关文章:

python - 编译脚本文件 Lua 或 Python

python - 希望合并/连接/分组 Pandas 数据框中的不同行

python - 如何将用户本地 python 解释器设置为集群上的默认解释器

Python - 如何利用多个 CPU 核心

python - 如何将此 XPath 表达式转换为 BeautifulSoup?

python - Flask - 获取 html 选择选项标签内的文本而不是选项的值

python - 无法使用 anaconda 安装 ggplot

python - 数据帧上的averageifs异常出现问题

python-2.7 - 即使 RAM 空闲,内存也会出现错误

python - 在 Python/pandas 中使用正则表达式查找城市名称