排序演算法在各種程式中都有廣泛的應用,排序的核心就是按照某種規則比較所謂的「大小」,然後交換位置,如果是數字,我們可以直接比較,但如果是字串或者兩個字典呢?直接比較數學上的大小是沒有意義的,因此,比較的過程必須通過函式抽象出來。
python的內建sorted函式就可以對list進行排序。
>>
>
sorted([
36,5,
15,-9
,12,24
])[-
9,5,
12,15,
24,36]
此外,sorted()也是乙個高階函式,能夠包含乙個關鍵字key使待排序的list能按照key的有關規則進行排序,下面就是乙個小例子。
>>
>
sorted([
36,-5
,4,25
,12,-
40],key =
abs)[4
,-5,
12,25,
36,-40
]
abs就是對list裡的所有數字的絕對值進行排序。
然後就是利用sorted函式對子符串進行排序,預設情況下,對字串排序,是按照ascii的大小比較的,由於』z』 < 『a』,結果,大寫字母z會排在小寫字母a的前面。
現在,我們提出排序應該忽略大小寫,按照字母序排序。要實現這個演算法,不必對現有**大加改動,只要我們能用乙個key函式把字串對映為忽略大小寫排序即可。忽略大小寫來比較兩個字串,實際上就是先把字串都變成大寫(或者都變成小寫),再比較。
這樣,我們給sorted傳入key函式,即可實現忽略大小寫的排序:
>>
>
sorted([
'b',
'list'
,'abs'
,'key'
,'wto'])
['b'
,'list'
,'abs'
,'key'
,'wto'
]#預設的ascii碼排序
>>
>
sorted([
'b',
'list'
,'abs'
,'key'
,'wto'
],key =
str.lower)
['abs'
,'b'
,'key'
,'list'
,'wto'
]#忽略大小寫的排序,把大寫的字元在排序的階段進行改寫為小寫。
前面我們也曾經介紹過,如果想要把什麼東西逆置,就需要額外的乙個限定條件為reverse = true,排序也不例外,還是上個例子:
>>
>
sorted([
'b',
'list'
,'abs'
,'key'
,'wto'
],reverse =
true)[
'wto'
,'key'
,'abs'
,'list'
,'b'
]>>
>
sorted([
'b',
'list'
,'abs'
,'key'
,'wto'
],key =
str.lower,reverse =
true)[
'wto'
,'list'
,'key'
,'b'
,'abs'
]
結果顯而易見,從上述例子可以看出,高階函式的抽象能力是非常強大的,而且,核心**可以保持得非常簡潔。
小練習假設我們用一組tuple表示學生名字和成績:
l = [(『bob』, 75), (『adam』, 92), (『bart』, 66), (『lisa』, 88)]
請用sorted()對上述列表分別按名字排序:
>>
>
defby_name
(t):
return t[0]
.lower(
)>>
> l =[(
'bob',75
),('adam',92
),('bart',66
),('lisa',88
)]>>
> l2 =
sorted
(l,key = by_name)
>>
>
print
(l2)[(
'adam',92
),('bart',66
),('bob',75
),('lisa',88
)]
再按成績從高到低排序:
>>
>
defby_score
(t):
return t[1]
>>
> l =[(
'bob',75
),('adam',92
),('bart',66
),('lisa',88
)]>>
> l2 =
sorted
(l,key = by_score)
>>
>
print
(l2)[(
'bart',66
),('bob',75
),('lisa',88
),('adam',92
)]>>
> l2 =
sorted
(l,key = by_score,reverse =
true
)>>
>
print
(l2)[(
'adam',92
),('lisa',88
),('bob',75
),('bart',66
)]
python高階三 函式
在python中函式用關鍵字def宣告,引數用逗號隔開,另外需要注意的是函式沒有返回型別 python函式不指定特定的返回型別,甚至不需要指定是否返回乙個值 但實際上,每乙個python函式都會返回一 個值 如果執行了return語句,那麼它會返回這個值,否則,它返回乙個none none是pyth...
python 函式高階 python 函式高階
形參角度 萬能引數 動態接收位置引數 args 動態接收關鍵字引數 kwargs 的魔性用法 函式定義時 代表聚合。他將所有的位置引數 聚合成乙個元組,賦值給了args 函式定義時 將所有的關鍵字引數聚合成乙個字典中,將這個字典賦給了 kwargs 和 在函式的呼叫時 代表打散 僅限關鍵字引數 de...
Python複習筆記(三)函式高階
在 python 中,列表變數呼叫 本質上是在執行列表變數的 extend 方法,不會修改變數的引用 這裡,難理解的就是generator和函式的執行流程不一樣。函式是順序執行,遇到return語句或者最後一行函式語句就返回。而變成generator的函式,在每次呼叫next 的時候執行,遇到yie...