天天看點

從錯誤中學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
[, , , , ]