items 是一個list of tuple,如果針對tuple 排序,Python 的Builtin function sorted(或sort) 會從tuple的最後一個元素開始進行排序,也就是說一組二元素的tuple 進行排序可以想像成兩次基本的排序:items 是一個 list of tuple,如果針對 tuple 排序,Python 的 Builtin function sorted(或是sort) 會從 tuple 的最後一個元素開始進行排序,也就是說一組二元素的 tuple 進行排序可以想像成兩次基本的排序:
if __name__ == '__main__':
s = 'asdf234GDSdsf23'
print('key=x')
s = sorted(s, key=lambda x: x)
for x in s:
print((x, x))
print('key=islower()')
s = sorted(s, key=lambda x: x.islower())
for x in s:
print((x.islower(), x))
print('key=isupper()')
s = sorted(s, key=lambda x: x.isupper())
for x in s:
print((x.isupper(), x))
print('key=isdigit() and int(x)%2==0')
s = sorted(s, key=lambda x: x.isdigit() and int(x) % 2 == 0)
for x in s:
print((x.isdigit() and int(x) % 2 == 0, x))
print('key=(x.isupper(), x.islower())')
s = sorted(s, key=lambda x: (x.isupper(), x.islower()))
for x in s:
print((x.isupper(), x.islower(), x))
print('key=(x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x))')
s = sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x))
for x in s:
print((x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x))
先比較元組的第一個值,FALSE
讓我們從一個簡單的例子開始:
結果:
items
是一個list of tuple,如果針對tuple 排序,Python 的Builtin functionsorted
(或sort
) 會從tuple的最後一個元素開始進行排序,也就是說一組二元素的tuple 進行排序可以想像成兩次基本的排序:items
是一個 list of tuple,如果針對 tuple 排序,Python 的 Builtin functionsorted
(或是sort
) 會從 tuple 的最後一個元素開始進行排序,也就是說一組二元素的 tuple 進行排序可以想像成兩次基本的排序:原本是:
第一次排序以第2個元素為 key,所以排序的結果為:
第二次排序以第1個元素為 key,所以排序的結果為:
結論(1):
tuple 的排序由最後的元素往前依次進行排序
也就是說 tuple 的排序權重是由第一個元素開始依次向後遞減
接著我們來觀察一下 Boolean value 的排序:
結果:
結論2:
Boolean 的排序會將
False
排在前,True
排在後那我們來看看你給出的例子,我們撰寫一個簡單的 function 來觀察結果:
function
show
會列印出當下的字串s
用來排序時每個字元所產生的 tuple key.接著我們套用剛剛的結論1,我們先不使用 tuple 來作為 key,反而利用等價的 由最後一個元素往前依次為 key 排序,並且逐步觀察
s
和 tuple key 的變化:我們將會發現一如預期地,依照結論(1),這樣的做法的確等價於一口氣以 tuple 為 key 來排序.
原本是:同時觀察,結論(2),對於
isdigit()
,isupper()
,islower()
第一次排序以第2個元素為 key,所以排序的結果為:
第二次排序以第1個元素為 key,所以排序的結果為: 結論(1)結論2
:False
排在前,True
排在後有趣的是:我們想要讓判斷式為
True
的字元在排序完成後在比較前面的位置,所以根據結論(2)加了一個not
來讓符合的字符可以在前面.關鍵之處如donghui所说,FALSE<TRUE。
donghui
所說,FALSEkey为元组的排序情况,是每个待排序元素生成一个元组
(x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x)
,排序时是根据这个元组排序,依据是FALSE<TRUE,false排前,true排后,相同则看下一个。sorted最终返回的是需要排序的元素。测试代码如下:(来源自
運行查看輸入可以發現規律。 🎜輸出:🎜dokelung
和donghui
key為元組的排序情況,是每個待排序元素產生一個元組(x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper() , x.islower(), x)
,排序時是根據這個元組排序,依據是FALSE測試代碼如下:(來源自
dokelung
和donghui
)