代码之家  ›  专栏  ›  技术社区  ›  Sundar R

python的sorted()函数是否保证稳定?

  •  74
  • Sundar R  · 技术社区  · 16 年前

    这个 documentation 不能保证。有没有其他地方记录在案?

    我猜它可能是稳定的,因为列表上的排序方法是 guaranteed to be stable (注意第9点:“从Python2.3开始,sort()方法保证是稳定的”),sorted在功能上是类似的。但是,我找不到任何确切的消息来源。

    目的:如果两个记录中的主键相等,我需要根据主键和次键进行排序。如果sorted()被保证是稳定的,我可以对次键进行排序,然后对主键进行排序,得到所需的结果。

    注:为了避免混淆,我使用了stable,意思是“如果排序保证不改变比较相等的元素的相对顺序,那么排序是稳定的”。

    5 回复  |  直到 7 年前
        1
  •  96
  •   Alex Martelli    16 年前

    是的,本手册的目的确实是保证 sorted 是稳定的,而且它使用的算法与 sort 方法。我确实意识到文档并不是100%清楚这个身份;文档补丁总是被愉快地接受!

        2
  •  23
  •   tzot    7 年前

    他们是 stable .

    顺便说一句:有时可以忽略sort和sorted是否稳定,方法是将一个多通道排序合并到一个单通道排序中。

    例如,如果要根据对象的 last_name , first_name 属性,可以一次完成:

    sorted_list= sorted(
        your_sequence_of_items,
        key= lambda item: (item.last_name, item.first_name))
    

    利用元组比较。

    这个答案,原封不动地涵盖了最初的问题。对于进一步排序相关问题,有 Python Sorting How-To .

        3
  •  2
  •   MSeifert    7 年前

    文件同时改变了( relevant commit )以及 sorted 明确保证:

    内置的 sorted() 功能保证稳定。排序是稳定的,如果它保证不更改比较相等的元素的相对顺序,这有助于在多个过程中进行排序(例如,按部门排序,然后按薪资等级排序)。

    这部分文档被添加到Python2.7和Python3.4中,因此 顺从的 该语言版本的实现应该 稳定的 排序的 .

    注意,对于cpython list.sort 从那以后一直很稳定 Python 2.3

    • 蒂姆·彼得斯重写了他的 list.sort() 实现-这是一个“稳定排序”(相等的输入在输出中以相同的顺序出现)并且比以前更快。

    我不是百分之百确定 排序的 ,现在它的用途很简单 列表排序 ,但我还没查历史。但很可能它“总是”使用 列表排序 .

        4
  •  0
  •   Peter Hansen    8 年前

    这个 "What's New" docs for Python 2.4 有效地指出sorted()首先创建一个列表,然后对其调用sort(),从而为您提供所需的保证,尽管不是在“官方”文档中。如果你真的担心的话,你也可以查一下来源。

        5
  •  0
  •   Don Hatch    7 年前

    关于排序的Python3.6文档现在声明

    种类保证稳定

    此外,在那份文件中,有一个指向马厩的链接 Timsort ,其中说明

    timsort自2.3版以来一直是python的标准排序算法。

    推荐文章