Answers:
是的,该手册的目的实际上是为了确保它sorted
的稳定性,并且确实使用与该sort
方法完全相同的算法。我的确意识到文档不是100%清楚这种身份。总是很高兴地接受doc补丁!
key
显式传递参数。
他们是稳定的。
顺便说一句:您有时可以通过将多遍排序组合到单遍排序中而忽略了解排序和排序是否稳定。
例如,如果要排序基于它们的对象last_name
,first_name
属性,你可以做一个合格:
sorted_list= sorted(
your_sequence_of_items,
key= lambda item: (item.last_name, item.first_name))
利用元组比较。
此答案按原样涵盖了原始问题。对于与排序有关的其他问题,有Python排序方法。
key= lambda item: (-item.rating, item.price)
或提供a cmp
而不是key
参数。不过,我仍然不确定您发表评论的目的。
同时更改了文档(相关的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
。
Python 2.4的“新增功能”文档有效地指出了sorted()首先创建一个列表,然后在其上调用sort()的事实,这为您提供了所需的保证,尽管不在“官方”文档中。如果您真的很担心,也可以只检查源。
sorted([(1, 2), (1, 1)])
返回[(1, 1), (1, 2)]
而不是按相同的顺序/顺序返回原始输入。保证稳定性不应该意味着它应该返回原始[(1, 2), (1, 1)]
输入吗?在这种情况下,你必须是明确的,并说sorted([(1, 2), (1, 1)], key=lambda t: t[0])