日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【转载】Python3 sorted函数中key参数的作用原理

發(fā)布時間:2025/10/17 python 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】Python3 sorted函数中key参数的作用原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

https://segmentfault.com/q/1010000005111826
dokelung 4.8k 的回答

讓我們從一個簡單的例子開始:
items = [(1, 2), (2, 1)]
print(sorted(items))

結(jié)果:
[(1, 2), (2, 1)]

items 是一個 list of tuple,如果針對 tuple 排序,Python 的 Builtin function sorted(或是sort) 會從 tuple 的最後一個元素開始進行排序,也就是說一組二元素的 tuple 進行排序可以想像成兩次基本的排序:

原本是:
[(2, 1), (1, 2)]

第一次排序以第2個元素為 key,所以排序的結(jié)果為:
[(2, 1), (1, 2)]

第二次排序以第1個元素為 key,所以排序的結(jié)果為:
[(1, 2), (2, 1)] # 最終結(jié)果

結(jié)論(1):

tuple 的排序由最後的元素往前依次進行排序
也就是說 tuple 的排序權(quán)重是由第一個元素開始依次向後遞減

接著我們來觀察一下 Boolean value 的排序:
print(sorted([True, False])

結(jié)果:
[False, True] # False在前,True在後

結(jié)論2:

Boolean 的排序會將 False 排在前,True排在後

那我們來看看你給出的例子,我們撰寫一個簡單的 function 來觀察結(jié)果:
def show(s):
for x in s:
print((x.isdigit(), x.isdigit() and int(x)%2==0, x.isupper(), x.islower(), x))

function show 會列印出當下的字串 s 用來排序時每個字元所產(chǎn)生的 tuple key.

接著我們套用剛剛的結(jié)論1,我們先不使用 tuple 來作為 key,反而利用等價的 由最後一個元素往前依次為 key 排序,並且逐步觀察 s 和 tuple key 的變化:
print(‘key=x’)
s = sorted(s ,key=lambda x: x)
show(s)

print(‘key=islower()’)
s = sorted(s ,key=lambda x: x.islower())
show(s)

print(‘key=isupper()’)
s = sorted(s ,key=lambda x: x.isupper())
show(s)

print('key=isdigit() and int(x)%20’)
s = sorted(s ,key=lambda x: x.isdigit() and int(x)%20)
show(s)

我們將會發(fā)現(xiàn)一如預期地,依照結(jié)論(1),這樣的做法的確等價於一口氣以 tuple 為 key 來排序.
同時觀察,結(jié)論(2),對於 isdigit(), isupper(), islower()等所產(chǎn)生的 Boolean key 來說,排序的結(jié)果也如預期.
print(‘key=isdigit()’)
s = sorted(s ,key=lambda x: x.isdigit())
show(s)

不過我想這還不是我們最後的結(jié)論,因為這是一個碰巧的結(jié)果(說碰巧也許太超過了,應(yīng)該說是不那麼直覺的結(jié)果),讓我們根據(jù) 結(jié)論(1) 對最初的例子進行分析:
sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x))

這個排序我們可以翻譯成:

先對字元x本身做排序,接著是對 字元是否為小寫,字元是否為大寫,字元是否為偶數(shù),字元是否為數(shù)字分別作排序.

也可以翻譯成:

我們以 字元是否為數(shù)字為最高排序權(quán)重,接著以字元是否為偶數(shù),字元是否為大寫,字元是否為小寫,字元x本身為權(quán)重來做排序.

這似乎與一開始的目標(#排序:小寫-大寫-奇數(shù)-偶數(shù))不同,起碼跟目標沒有直覺上的對應(yīng).

建議可以改成:
print("".join(sorted(s1, key=lambda x: (not x.islower(), not x.isupper(), not(x.isdigit() and int(x)%2==1), x))))

這樣就可以解讀為:

我們以 字元是否為小寫為最高權(quán)重,接著以字元是否為大寫,字元是否為奇數(shù),字元x本身為權(quán)重來做排序

有趣的是:我們想要讓判斷式為 True 的字元在排序完成後在比較前面的位置,所以根據(jù)結(jié)論(2)加了一個 not來讓符合的字元可以在前面.

總結(jié)

以上是生活随笔為你收集整理的【转载】Python3 sorted函数中key参数的作用原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。