題目:
對一個列表進行排序
錯誤的解法
>>> lst=[9,2,6,4,1]
>>> lst
[9, 2, 6, 4, 1]
>>> y=lst.sort()
>>> y
>>>
list的sort是本地排序的,返回的是None,所以結果lst是排序后的列表,y是None。
相似的原因,下面的做法也是錯的
>>> lst=[9,2,6,4,1]
>>> lst
[9, 2, 6, 4, 1]
>>> (lst.sort()).reverse()
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
(lst.sort()).reverse()
AttributeError: 'NoneType' object has no attribute 'reverse'
也就是方法不能連用了。
那么我們就知道sort方法的特點了:1是本地排序,2是返回None,這樣我們就需要處理一些問題了。
不想本地排序怎么辦
最容易想到的辦法是使用另一個變量
>>> x=lst
>>> x.sort()
>>> x
[1, 2, 4, 6, 9]
>>> lst
[1, 2, 4, 6, 9]
這里我們發現,雖然使用了另一個變量依然改變了原來的值,這是因為我們等號傳遞的是地址。那么我們如果想使用另一變量解決本地排序的問題可以用下面的方法做。
>>> lst=[9,2,6,4,1]
>>> x=lst[:]
>>> x.sort()
>>> lst
[9, 2, 6, 4, 1]
>>> x
[1, 2, 4, 6, 9]
當然我們也可以使用一個sorted函數(不是list的方法,而是一個內建函數)
>>> lst=[9,2,6,4,1]
>>> y=sorted(lst)
>>> lst
[9, 2, 6, 4, 1]
>>> y
[1, 2, 4, 6, 9]
這個函數不是本地排序的,而是把結果的list返回出來。
這個sorted內建函數和reversed內建函數有點像,不過reversed內建函數返回的reverse iterator對象,sorted返回的是一個列表。
>>> z=reversed(lst)
>>> z
<list_reverseiterator object at 0x0000000003BC5BE0>
>>> list(z)
[1, 4, 6, 2, 9]
兩個可選參數
函數指針型key與布爾型reverse
>>> lst.sort(key = lambda x:-1*x)
>>> lst
[9, 6, 4, 2, 1]
>>> lst.sort(key = lambda x:-1*x,reverse=True)
>>> lst
[1, 2, 4, 6, 9]
版權聲明:本文為博主原創文章,歡迎轉載和分享,但請聲明出處
http://blog.csdn.net/zhzz2012/article/details/47958453