天天看点

从错误中学python(5)——list的sort方法题目:错误的解法不想本地排序怎么办两个可选参数

题目:

对一个列表进行排序

错误的解法

>>> lst=[,,,,]
>>> lst
[, , , , ]
>>> y=lst.sort()
>>> y
>>> 
           

list的sort是本地排序的,返回的是None,所以结果lst是排序后的列表,y是None。

相似的原因,下面的做法也是错的

>>> lst=[,,,,]
>>> lst
[, , , , ]
>>> (lst.sort()).reverse()
Traceback (most recent call last):
  File "<pyshell#10>", line , in <module>
    (lst.sort()).reverse()
AttributeError: 'NoneType' object has no attribute 'reverse'
           

也就是方法不能连用了。

那么我们就知道sort方法的特点了:1是本地排序,2是返回None

这样我们就需要处理一些问题了。

不想本地排序怎么办

最容易想到的办法是使用另一个变量复制一份要排序的内容

>>> x=lst
>>> x.sort()
>>> x
[, , , , ]
>>> lst
[, , , , ]
           

这里我们发现,虽然使用了另一个变量依然改变了原来的值,这是因为我们等号传递的是地址。那么我们如果想使用另一变量解决本地排序的问题可以用下面的方法做。

>>> lst=[,,,,]
>>> x=lst[:]
>>> x.sort()
>>> lst
[, , , , ]
>>> x
[, , , , ]
           

当然我们也可以使用一个sorted函数(不是list的方法,而是一个函数)

>>> lst=[,,,,]
>>> y=sorted(lst)
>>> lst
[, , , , ]
>>> y
[, , , , ]
           

这个函数不是本地排序的,而是把结果的list返回出来。

这个sorted方法和reversed方法有点像,不过reversed方法返回的reverse iterator对象,sorted返回的是一个列表。

>>> z=reversed(lst)
>>> z
<list_reverseiterator object at >
>>> list(z)
[, , , , ]
           

两个可选参数

函数指针型key与布尔型reverse

>>> lst.sort(key = lambda x:-*x)
>>> lst
[, , , , ]
>>> lst.sort(key = lambda x:-*x,reverse=True)
>>> lst
[, , , , ]