是的,本手册的目的确实是保证sorted
稳定,并且确实使用与sort
方法完全相同的算法。我确实意识到文档在这个内容上并不完全清晰,欢迎提交文档补丁!
它们是稳定的。
顺便说一下:有时候你可以通过将多次排序组合成一次单通道排序来忽略了解sort和sorted是否稳定。
例如,如果您想根据对象的last_name
和first_name
属性进行排序,则可以在一个通道中完成:
sorted_list= sorted(
your_sequence_of_items,
key= lambda item: (item.last_name, item.first_name))
利用元组比较的优势。key=lambda item: (-item.rating, item.price)
或提供一个cmp
而不是一个key
参数。但我仍然不确定你的评论目的是什么。 - tzot文档在此期间发生了变化(相关提交),而sorted
的当前文档明确保证:
内置的
sorted()
函数保证是稳定的。如果排序保证不更改比较相等的元素的相对顺序,则该排序是稳定的 - 这有助于多次排序(例如,按部门排序,然后按薪资等级排序)。
这部分文档已添加到Python 2.7和Python 3.4(+)中,因此任何符合该语言版本的实现都应该具有稳定的sorted
。
请注意,对于CPython,自Python 2.3以来,list.sort
一直是稳定的。
- Tim Peters重新编写了他的
list.sort()
实现-这是一种“稳定排序”(相等的输入在输出中以相同的顺序出现),比以前更快。
我对sorted
没有100%的把握,现在它只是简单地使用list.sort
,但我还没有检查过历史记录。但很可能它“始终”使用list.sort
。
Python 3.6文档中关于排序的说明现在已经明确表示:
排序是稳定的
此外,在该文档中,还有一个链接到稳定的Timsort算法的页面,其中指出:
自2.3版本以来,Timsort一直是Python的标准排序算法
"Python 2.4的新特性"文档有效地表明sorted()首先创建一个列表,然后对其进行排序,为您提供了所需的保证,尽管它并未在“官方”文档中说明。如果您真的担心,也可以直接查看源代码。
sorted([(1, 2), (1, 1)])
返回[(1, 1), (1, 2)]
,而不是按照原始顺序返回相同的输入。稳定性的保证不应该意味着它应该返回原始输入吗?在这种情况下,您需要显式说明并使用key=lambda t: t[0]
来排序:sorted([(1, 2), (1, 1)], key=lambda t: t[0])
。 - code_dredd