1. 程式人生 > 實用技巧 >python中sort()函式的key引數用法(轉載)

python中sort()函式的key引數用法(轉載)

今天在學習匿名函式lambda的時候遇到了一個沒怎麼想明白的問題。

strings = ['foo', 'card', 'bar', 'aaaa', 'abab']
# 根據字串中不同字母的數量對一個字串集合進行排序
strings.sort(key=lambda x: len(set(list(x))))

上面strings輸出的結果為:[‘aaaa’, ‘foo’, ‘abab’, ‘bar’, ‘card’]
結果是明白的,但是過程一開始沒弄清楚。
後來百度了一下,參考了別人的解析才弄明白。

主要是瞭解sort()函式中引數key的意思:
傳遞給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引數的作用)。
好了,就介紹到這,希望大家有所收穫~