问题:python的sorted()函数是否保证稳定?
该文档不能保证。还有其他记录在案的地方吗?
我猜想它可能是稳定的,因为可以保证列表上的sort方法是稳定的(注9:“从Python 2.3开始,保证sort()方法是稳定的”),并且sorted在功能上相似。但是,我找不到任何明确的说法。
目的:如果两个记录中的主键相等,则需要基于主键和辅助键进行排序。如果保证sorted()是稳定的,那么我可以对辅助键进行排序,然后对主键进行排序,并获得所需的结果。
PS:为避免任何混乱,我使用“稳定”的含义是“排序是稳定的,如果它保证不更改比较相等的元素的相对顺序”。
回答 0
是的,该手册的目的实际上是为了确保它sorted
的稳定性,并且确实使用与该sort
方法完全相同的算法。我的确意识到文档不是100%清楚这种身份。总是很高兴地接受doc补丁!
回答 1
他们是稳定的。
顺便说一句:您有时可以通过将多遍排序组合到单遍排序中而忽略了解排序和排序是否稳定。
例如,如果要排序基于它们的对象last_name
,first_name
属性,你可以做一个合格:
sorted_list= sorted(
your_sequence_of_items,
key= lambda item: (item.last_name, item.first_name))
利用元组比较。
此答案按原样涵盖了原始问题。对于与排序有关的其他问题,有Python排序方法。
回答 2
同时更改了文档(相关的commit),并且的当前文档sorted
明确保证:
内置
sorted()
功能保证稳定。如果可以保证不更改比较相等的元素的相对顺序,则排序是稳定的-这有助于多次通过排序(例如,按部门排序,然后按薪级等级排序)。
该文档的这一部分已添加到Python 2.7和Python 3.4(+)中,因此该语言版本的任何兼容实现都应具有稳定的sorted
。
请注意,对于CPython,list.sort
自Python 2.3起一直保持稳定
- 蒂姆·彼得斯(Tim Peters)重新编写了他的
list.sort()
实现-这是一种“稳定的排序”(相等的输入在输出中以相同的顺序出现)并且比以前更快。
我目前尚不确定100%的sorted
使用率list.sort
,但现在还可以查看历史记录。但是很可能“总是”使用了它list.sort
。
回答 3
Python 2.4的“新增功能”文档有效地指出了sorted()首先创建一个列表,然后在其上调用sort()的事实,这为您提供了所需的保证,尽管不在“官方”文档中。如果您真的很担心,也可以只检查源。