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

时间:2009-12-16 15:30:02

标签: python sorted stable-sort

documentation并不保证。是否还有其他记录的地方?

我猜它可能是稳定的,因为列表上的排序方法是guaranteed to be stable(注意第9点:“从Python 2.3开始,sort()方法保证稳定”),并且排序为功能相似。但是,我无法找到任何明确的消息来源。

目的:在两个记录中主键相等的情况下,我需要根据主键和辅助键进行排序。如果sorted()保证稳定,我可以对辅助键进行排序,然后对主键进行排序并获得我需要的结果。

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

5 个答案:

答案 0 :(得分:100)

是的,本手册的目的确实是为了保证sorted稳定,并确实使用与sort方法完全相同的算法。我确实意识到文档并不是100%清楚这个身份; doc贴片总是被高兴地接受!

答案 1 :(得分:23)

他们是stable

顺便说一句:你有时可以通过在单遍传递中组合多次传递排序来忽略排序和排序是否稳定。

例如,如果您想根据last_namefirst_name属性对对象进行排序,则可以一次性完成:

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

利用元组比较。

原则上,这个答案涵盖了原始问题。有关进一步排序相关的问题,有Python Sorting How-To

答案 2 :(得分:2)

同时更改了文档(relevant commit),sorted的当前文档明确保证:

  

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

这部分文档已添加到Python 2.7和Python 3.4(+)中,因此该语言版本的任何兼容实现应具有稳定sorted

请注意,对于CPython,自Python 2.3

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

我对sorted并非100%肯定,现在很简单地使用list.sort,但我还没有检查历史记录。但它可能总是"总是"使用list.sort

答案 3 :(得分:0)

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

答案 4 :(得分:0)

关于排序的Python 3.6文档现在声明了

  

种类保证稳定

此外,在该文档中,有一个指向稳定Timsort的链接,其中指出了

  

自2.3版以来,Timsort一直是Python的标准排序算法