一日一技:包含元組的列表,對第一個元素升序第二個元素降序
大家都知道,在Python里面可以使用??.sort?
??方法或者??sorted?
?函數對各種數據進行排序,例如:
運行效果如下圖所示:
我們也知道,Python中的元組是可以比較大小的。它的比較方法就是先對第一個元素比較,如果第一個元素相等,再比較第二個元素。因此對包含元組的列表也可以這樣排序,例如:
但現在問題來了,如果要對這個列表排序,但是需要對元組中的第一個元素升序,第二個元素降序,應該怎么辦呢?
之前有一個很簡單的算法題:輸入一串字符串,輸出出現次數最高的3個字母:
運行效果如下圖所示:
如果你做過這個算法題,那么你肯定知道怎么做。只需要設置??key?
?參數就可以了。在第二個元素前面加個負號:
運行效果如下圖所示:
現在問題來了,如果被排序的列表里面的元組第二項,不是數字,而是字符串怎么辦?字符串前面又不能加負號啊。
例如對如下列表進行排序,按元組第一個元素升序,第二個元素降序:
可能有同學會想到,可以把字符轉成Ascii碼再來加負號。這個方法對單個字符確實可行,但是當字符串有多個字符時,這樣做就顯得很麻煩了。
為了解決這個問題,我們需要回想一下,為什么在Python里面,有一些對象可以比大小,另一些對象卻不行?為什么字符串可以比大小,數字可以比大小,但是當我自定義一個類,然后生成對象的時候,卻不能比大小?
Python里面能比較大小的對象,是因為他們的類里面有一類特殊的魔術方法:??__eq__?
?用來判斷是否相等,??__lt__?
?用來判斷是否小于,??__gt__?
?來判斷是否大于……,例如:
這樣一來,如果想要倒序,只需要把??__lt__?
?里面的邏輯反過來就可以了:
我們再來寫一下排序函數,對于需要倒序的位置使用這個自定義的類包一下:
運行效果如下圖所示:
并且,這個類對字符串排序依然適用: