最近在看effective-python,第二章函數(shù)中提到了優(yōu)先排序的概念漱逸,具體代碼如下:
values = [1, 5, 3, 9, 7, 4, 2, 8, 6]
group = [7, 9]
def sort_priority(values, group):
def helper(x):
if x in group:
return (0, x)
return (1, x)
values.sort(key=helper)
sort_priority(values, group)
print(values)
[7, 9, 1, 2, 3, 4, 5, 6, 8]
這代碼的目的是group優(yōu)先于values排序(前提就是values包含group)罐旗,使用了閉包和sort()函數(shù)士八,很熟悉芒珠,正好復(fù)習(xí)一下牺堰。
sort(key=None, reverse=False)
sort()有兩個(gè)參數(shù)拄轻,一個(gè)是reverse,這個(gè)非常簡單伟葫,就是字面意思恨搓,如果設(shè)為True則反向排序(godv:?筏养?斧抱?)。另一個(gè)就是今天重點(diǎn)要說的渐溶,key辉浦,通常在字典的排序中可以見到這個(gè)參數(shù)(一般字典排序用sorted()):
dict = {'b': 1, 'r': 7, 'z': 2}
content = list(dict.items()) # 先轉(zhuǎn)換為列表包含元祖的形式
打印如下:
[('b', 1), ('z', 2), ('r', 7)]
content.sort(key=lambda x:x[0]) # 這里的0就是元祖的第一個(gè)元素,也就是按鍵排序掌猛。按值就是把0改成1
打印如下:
[('b', 1), ('c', 7), ('z', 2)]
原理:在排序之前盏浙,content里的所有元素都會(huì)執(zhí)行key的函數(shù),這里指的就是lambda函數(shù)荔茬,計(jì)算出值之后废膘,賦值給key(相當(dāng)于{'b': ('b', 1)}),然后sort()是針對key進(jìn)行排序慕蔚,然后再根據(jù)這個(gè)key對應(yīng)的值替換到排好序的content里丐黄。
看到這里,優(yōu)先排序的代碼就非常清晰了:
helper()函數(shù)判斷value中哪些元素在group中孔飒,并把其設(shè)置為以0為第一個(gè)元素的元祖灌闺,而不在group的元素則設(shè)置為以1為第一個(gè)元素的元祖,所以在sort()函數(shù)排序時(shí)坏瞄,位置靠前的當(dāng)然時(shí)以0開頭的元祖(鍵相同則按值排序)桂对,于是便完成了優(yōu)先排序。
以上鸠匀!