为什么Python3.0中sort/sorted去掉了cmp参数?

2024-04-06

from 蟒蛇维基 https://wiki.python.org/moin/HowTo/Sorting/#The_Old_Way_Using_the_cmp_Parameter: In Py3.0, the cmp parameter was removed entirely (as part of a larger effort to simplify and unify the language, eliminating the conflict between rich comparisons and the __cmp__ methods).

我不明白为什么 cmp 在 py3.0 中被删除的原因

考虑这个例子:

>>> def numeric_compare(x, y):
        return x - y
>>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)
[1, 2, 3, 4, 5]

现在考虑这个版本(推荐并兼容3.0):

def cmp_to_key(mycmp):
    'Convert a cmp= function into a key= function'
    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]

后者非常冗长,而前者只需一行即可达到相同的目的。另一方面,我正在编写我的自定义类,我想为其编写__cmp__方法。根据我在网上的一点阅读,建议写__lt__,__gt__,__eq__,__le__,__ge__,__ne__ and not __cmp__再说一遍,为什么要推荐这个?我可以不只是定义__cmp__让生活更简单?


对于两个对象a and b, __cmp__要求one of a < b, a == b, and a > b是真的。但情况可能并非如此:考虑集合,其中很常见的是这些都没有是真的,例如{1, 2, 3} vs {4, 5, 6}.

So __lt__并介绍了朋友。但这给 Python 留下了两种独立的排序机制,这有点荒谬,所以在 Python 3 中删除了不太灵活的机制。

您实际上不必实现所有六种比较方法。您可以使用@total_ordering装饰者 http://docs.python.org/3/library/functools.html#functools.total_ordering并且只执行__lt__ and __eq__.

编辑:另请注意,在排序的情况下,key函数可以比cmp:在您给出的示例中,Python 可能必须调用您的 Python 比较函数 O(n²) 次。但一个key函数只需要被调用 O(n) 次,并且如果返回值是内置类型(通常就是这样),则 O(n²) 成对比较将通过 C。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Python3.0中sort/sorted去掉了cmp参数? 的相关文章

随机推荐

  • GC.Collect()

    好吧 我已经读过几个有关它的主题 但就这样吧 假设我有一个应用程序 基本上我会时不时地单击一个按钮 几分钟内会发生很多事情 然后它可能会再空闲一个小时 或者可能只是一分钟 在这一切结束之后 调用 GC Collect 不是一个很好的情况吗
  • Java EE、EJB 文件处理

    我正在开发一个网络应用程序 允许用户上传图片 然后系统将为他们生成拇指 我的问题依赖于这样一个事实 EJB 可以分布在多个服务器上 因此不允许直接处理文件 我可以将图像存储在数据库中 但我希望将它们作为文件存储在其中一台服务器中 我怎样才能
  • 将 Primefaces Jar 3.3 替换为 4.0 后,primefaces 计划事件颜色不起作用

    我使用 primefaces 4 0 并尝试更改 Primefaces Lazy Schedule 中事件的颜色 因此我有以下 xhtml 代码
  • JavaScript:扩展 Array.prototype 有什么危险?

    谷歌 JavaScript 风格指南建议不要延长Array prototype https google github io styleguide jsguide html disallowed features modifying bui
  • libgdal.so.20 问题 centos rgdal

    有人可以帮我理解 rgdal 的问题是什么吗 我为centos 6 64位安装了gdal 2 但没有成功安装rgdal 我试图找出问题所在 但在互联网上没有找到任何有用的信息 这是 Rstudio 服务器控制台 install packag
  • 获取异常实例类名

    我想知道这种情况下的异常实例是什么 try some risky actions catch Exception e System out println Get instance name there 我怎样才能实现这个目标 干得好 tr
  • Angular 10:无法编写参考

    我尝试按照 Angular 更新指南从 Angular 8 升级到 Angular 10 我的项目由核心应用程序 共享 2 个库 谷歌地图和共享组件 和一个额外的 apk fsm 2 个库 应用程序及其元数据 组成 核心和共享的构建正在通过
  • 对树数据进行分组、聚合和求和的最佳方法是什么?

    给定一个自引用表 Item Id pk ParentId fk 具有关联值的相关表 ItemValue ItemId fk Amount 和一些样本数据 Item ItemValues Id ParentId ItemId Amount 1
  • 提交某种类型的模型后运行函数

    我想在实例时运行一个函数Post模型已承诺 我想运行它any他们提交的时间 所以我不想在任何地方显式调用该函数 我怎样才能做到这一点 def notify subscribers post send email to subscribers
  • 在 oracle 树查询中连接其他表

    给定一个简单的 id description 表t1 比如 id description 1 Alice 2 Bob 3 Carol 4 David 5 Erica 6 Fred 以及一个父子关系表t2 比如 parent child 1
  • web2py 的多列唯一约束

    可以将特定列标记为 unique true 在 web2py 中处理多列唯一约束的最正确方法是什么 例如 假设我有一个汇率表 它可以包含 来源货币 目标货币 和 汇率 列 两行具有相同的来源和目的地货币是没有意义的 使 from to 组合
  • 共享主键

    我猜这是一个半常见的问题 但我在过去的问题列表中找不到它 我有一组需要共享主键索引的产品表 假设如下 product1 table id name category other fields product2 table id name c
  • java ProGuard 删除(收缩)未使用的类

    假设我有这个 Java 应用程序 package com site public class MyAppBase package com site free import com site MyAppBase public class My
  • 如何快速了解 SOA? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 GeometryReader 而不填充视图

    这就是我想要的布局 import SwiftUI import PlaygroundSupport struct TestView View let text String var body some View Text self text
  • VBA:单击元素后无法更改图像控制图片

    Setup 我有一个带有图像控件元素的 Excel VBA 用户窗体 当单击表单中的按钮时 图像控件的Picture使用以下代码设置 更新源 Set MyForm imgControl Picture LoadPicture pathToF
  • Angular 5 - 我应该使用哪个来向后导航 - href 或 location.back()?

    我有一个应用程序 可以导航到一个无法前进的页面 想象一下 单击电视指南中的某个节目以打开包含该节目详细信息的页面 显然您会想要返回到电视指南 对于返回电视指南的按钮 我有一个 a tag 最建议的用例是 Using href guide o
  • 按日期和状态获取订单 woocommerce

    我需要获取 woocommerce 中的订单列表 包含开始日期 最终日期和状态 我尝试使用一些技术 如所描述的迈克 乔利 http develop woothemes com woocommerce 2014 08 wc 2 2 order
  • 取子集时保留 R 对象的类属性

    我有一个名为gene table的R对象 它有类foo 现在我将这个gene table子集为 gene data gene table 1 100 1 5 然而 当我打电话时class gene data 它不再属于类foo 但相反 它有
  • 为什么Python3.0中sort/sorted去掉了cmp参数?

    from 蟒蛇维基 https wiki python org moin HowTo Sorting The Old Way Using the cmp Parameter In Py3 0 the cmp parameter was re