Python有两种排序方式:一种是排序方法(或“成员函数”),另一种是排序函数。排序方法是作用于被命名对象的内容上-可以将其视为对象正在采取的重新排序的操作。排序函数是对由对象表示的数据的一个操作,并返回一个按排序顺序排列的具有相同内容的新对象。
给定一个名为l
的整数列表,如果我们调用l.sort()
,列表本身将被重新排序:
>>> l = [1, 5, 2341, 467, 213, 123]
>>> l.sort()
>>> l
[1, 5, 123, 213, 467, 2341]
这个方法没有返回值。但是如果我们尝试赋值 l.sort()
的结果呢?
>>> l = [1, 5, 2341, 467, 213, 123]
>>> r = l.sort()
>>> print(r)
None
r
现在实际上等于空。这是程序员在离开Python一段时间后容易忘记的奇怪而有点烦人的细节之一(这也是我写这篇文章的原因,以便我不再忘记)。
另一方面,sorted()
函数不会改变l
的内容,但会返回一个新的已排序列表,其内容与l
相同:
>>> l = [1, 5, 2341, 467, 213, 123]
>>> r = sorted(l)
>>> l
[1, 5, 2341, 467, 213, 123]
>>> r
[1, 5, 123, 213, 467, 2341]
需要注意的是,返回的值并不是深度拷贝,因此对列表中包含的元素进行副作用操作时要像通常一样小心:
>>> spam = [8, 2, 4, 7]
>>> eggs = [3, 1, 4, 5]
>>> l = [spam, eggs]
>>> r = sorted(l)
>>> l
[[8, 2, 4, 7], [3, 1, 4, 5]]
>>> r
[[3, 1, 4, 5], [8, 2, 4, 7]]
>>> spam.sort()
>>> eggs.sort()
>>> l
[[2, 4, 7, 8], [1, 3, 4, 5]]
>>> r
[[1, 3, 4, 5], [2, 4, 7, 8]]
theSet = set(theList)
完成后,您只需要将其转换回列表:theList = list(theSet)
完成。简单吧。 - runlevel0sorted(theSet)
将theSet
转换成一个排序后的列表。 - Zazlist.sort
返回一个list
,那么它是原始的list
在原地变异,还是生成了一个新的?)。Python 内置对象坚持一个或另一个;对于像str
这样的不可变类型的方法 确实 进行链接(它们不能在原地进行变异,因此会返回一个带有变异的新对象),而大多数可变类型的list
方法则不会。但对于常见的情况,例如此类情况,存在sorted
能够达到类似的效果。 - ShadowRanger