python中sort()函式的key引數用法(轉載)
阿新 • • 發佈:2020-08-20
今天在學習匿名函式lambda的時候遇到了一個沒怎麼想明白的問題。
strings = ['foo', 'card', 'bar', 'aaaa', 'abab']
# 根據字串中不同字母的數量對一個字串集合進行排序
strings.sort(key=lambda x: len(set(list(x))))
上面strings輸出的結果為:[‘aaaa’, ‘foo’, ‘abab’, ‘bar’, ‘card’]
結果是明白的,但是過程一開始沒弄清楚。
後來百度了一下,參考了別人的解析才弄明白。
傳遞給key引數的是一個函式,它指定可迭代物件中的每一個元素來按照該函式進行排序
舉個例子:
# 這裡先看一個不帶key引數的sort()函式,大家很容易知道結果
li = [[1, 7], [1, 5], [2, 4], [1, 1]]
li.sort()
print(li)
# [[1, 1], [1, 5], [1, 7], [2, 4]] 預設按照0維排序 再按照1維排序
def fun(li):
return li[1]
# 這時將函式fun傳遞給引數key 得出結果
li.sort(key=fun)
print(li) # [[1, 1], [2, 4], [1, 5], [1, 7]]
我們可以發現好像是li中每個子元素的第二個數進行排序。
這就是key引數的作用,傳入了key引數的sort()函式對li中的每個子元素[1,7],[1,5],[2,4],[1,1]都執行了fun()函式,返回它們的第1個數,分別為7,5,4,1。然後再排序得到1,4,5,7。使的出的結果對本來的li進行排序最後就得到了[[1,1],[2,4],[1,5],[1,7]]。
上述用lambda可以表示為:li.sort(key=lambda li: li[1]),這裡的後面兩個li是變數名,可以隨意取如li.sort(key=lambda x: x[1])
最後我們再來解釋一下這句:
# 根據字串中不同字母的數量對一個字串集合進行排序
strings.sort(key=lambda x: len(set(list(x))))
按照字串不同字母的數量對一個字串集合進行排序,字串不同字母的數量,可以想到利用set集合的不重複性,於是想到利用len函式求出set集合的長度,再按照長度進行排序即可。這裡賦值給x的就是strings中的每一個元素(key引數的作用)。
好了,就介紹到這,希望大家有所收穫~